Django Admin显示/隐藏字段如果在下拉菜单中选择了特定值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Admin显示/隐藏字段如果在下拉菜单中选择了特定值相关的知识,希望对你有一定的参考价值。

在Django管理员中,当从下拉列表中选择Custom时,我想显示内联start_dateend_date字段,以允许用户指定特定的开始和结束日期而不是预定义的时间段。

经过一段时间的研究,建议包括:使用隐藏字段,在ModelAdmin中定义覆盖get_form,或使用自定义javascript(我没有经验)。

问题:当在Django Admin字段的下拉列表中选择特定值(start_date)时,如何显示(显示)内联end_dateCustom字段?当没有选择Custom时,start_dateend_date将被隐藏起来。


第1步:step 1 - select a date range

第2步:step 2 - if custom is selected

第3步:step 3 - show the inline custom date fields


下面是我在本地的确切示例代码的完整示例:

settings.朋友

INSTALLED_APPS = [
    'django.contrib.admin',
    ...
    'dropdown.apps.DropdownConfig',
]

apps.朋友

from django.apps import AppConfig

class DropdownConfig(AppConfig):
    name = 'dropdown'

models.朋友

from django.db import models

class DropdownModel(models.Model):

    CHOICES = (
        ('Today', 'Today'),
        ('Yesterday', 'Yesterday'),
        ('Last 7 Days', 'Last 7 Days'),
        ('Last 14 Days', 'Last 14 Days'),
        ('Last 30 Days', 'Last 30 Days'),
        ('Last 60 Days', 'Last 60 Days'),
        ('Last 90 Days', 'Last 90 Days'),
        ('This Year', 'This Year'),
        ('All Time', 'All Time'),
        ('Custom', 'Custom')
    )

    date_range = models.CharField(max_length=15)
    start_date = models.DateField()
    end_date = models.DateField()

forms.朋友

from django import forms
from dropdown.models import DropdownModel

class DropdownModelForm(forms.ModelForm):

    class Meta:
        model = DropdownModel
        fields = ('date_range',)
        widgets = {
            'date_range': forms.Select(choices=DropdownModel.CHOICES)
        }

admin.朋友

from django.contrib import admin
from dropdown.models import DropdownModel
from dropdown.forms import DropdownModelForm

class DropdownModelAdmin(admin.ModelAdmin):
    fieldsets = (
        ('Date Range', {
            'fields': ('date_range', ('start_date', 'end_date'))
        }),
    )
    form = DropdownModelForm

admin.site.register(DropdownModel, DropdownModelAdmin)
答案

此问题的目的:如果在Django管理表单下拉列表中选择了特定选项,则显示/隐藏字段集。

解决方案概述:您需要将字段集分成两个而不是一个自定义javascript,在ModelAdmin中定义Media类。

[第一步]在我的名为dropdown的项目中,我添加了以下文件夹/文件:

  • 静态(目录)
  • 静态/下拉(目录)
  • static / dropdown / js(目录)
  • static / dropdown / js / base.js(文件)

[第二步]在admin.py中,需要注意以下几点:

  1. 我把fieldsets分成两个而不是一个。
  2. 请注意,我正在为每个fieldset定义classesabcdefg是我试图显示和隐藏的字段集类的名称。
  3. 我定义了class Media。这告诉django在哪里寻找自定义的javascript和css文件。

admin.朋友

from django.contrib import admin
from dropdown.models import DropdownModel
from dropdown.forms import DropdownModelForm

class DropdownModelAdmin(admin.ModelAdmin):

    fieldsets = (
        ('Date Range', {
            'fields': ('date_range',),
            'classes': ('predefined',)
        }),
        (None, {
            'fields': (('start_date', 'end_date'),),
            'classes': ('abcdefg',)
        })
    )

    form = DropdownModelForm

    class Media:
        js = ('dropdown/js/base.js',)

admin.site.register(DropdownModel, DropdownModelAdmin)

[第三步]添加javascript。我不赞成这个剧本;我只是从here稍微改了一下。

base.js

(function($) {
    $(function() {
        var selectField = $('#id_date_range'),
            verified = $('.abcdefg');

        function toggleVerified(value) {
            if (value === 'Custom') {
                verified.show();
            } else {
                verified.hide();
            }
        }

        // show/hide on load based on pervious value of selectField
        toggleVerified(selectField.val());

        // show/hide on change
        selectField.change(function() {
            toggleVerified($(this).val());
        });
    });
})(django.jQuery);

[第四步]

forms.朋友

from django import forms
from dropdown.models import DropdownModel

class DropdownModelForm(forms.ModelForm):

    class Meta:
        model = DropdownModel
        fields = ('date_range',)
        widgets = {
            'date_range': forms.Select(choices=DropdownModel.CHOICES)
        }

以上是关于Django Admin显示/隐藏字段如果在下拉菜单中选择了特定值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Django 下拉菜单中的选择显示和隐藏表单字段

Django Admin Cookbook-36如何更改下拉菜单中的ForeignKey显示文本

如何在django-admin中隐藏特定记录的字段?

根据另一个字段中的选择显示/隐藏 django 管理表单字段

如何在 django admin change_form 中更改外键字段的顺序

如何隐藏 django-admin 中的某些字段?