如果在下拉列表中选择了特定值,则Django Admin显示/隐藏字段 [英] Django Admin Show / Hide Fields If Specific Value Is Selected In A Dropdown
问题描述
在Django管理员中,从下拉列表中选择选项自定义
时,我要显示内联开始日期
和 end_date
字段,允许用户指定特定的开始和结束日期,而不是预先定义的时间段。
经过一段时间的研究,建议包括:使用隐藏字段,在ModelAdmin中定义重写get_form或使用自定义Javascript(我对此经验为零)。
问题:如何显示(显示)内联开始日期
和结束日期
在Django Admin字段的下拉列表中选择特定值(自定义
)时输入的字段?如果未选择自定义
,则将开始日期
和结束日期
步骤1:
步骤2:
下面是我在本地有确切示例代码的完整示例:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
...
'd ropdown.apps.DropdownConfig',
]
apps.py
从django.apps导入AppConfig
类DropdownConfig(AppConfig):
名称='下拉'
models.py
从django.db导入模型
class DropdownModel(models.Model):
CHOICES =(
(今天,今天),
(昨天,昨天),
(过去7天,过去7天),
(过去14天,过去14天),
(过去30天,过去30天),
(过去60天,过去60天),
(过去90天,过去90天),
(今年,今年),
(所有时间,所有时间),
('Custom','Custom')
)
date_range = models.CharField(max_length = 15)
start_date = models.DateField()
end_date = models.DateField()
forms.py
from django从dropdown.models导入表单
导入DropdownModel
类DropdownModelForm(forms.ModelForm):
类Meta:
模型= DropdownModel
字段=('date_range',)
小部件= {
'date_range':forms.Select(choices = DropdownModel.CHOICES)
}
admin.py
from django.contrib import admin
from dropdown.models import DropdownModel
from dropdown.forms import DropdownModelForm
class DropdownModelAdmin(admin.ModelAdmin):
字段集=(
('日期范围',{
'fields':('date_range',('start_date','end_date'))
}),
)
形式= DropdownModelForm
admin.site.register(DropdownModel,DropdownModelAdmin)
此问题的目的:如果在Django管理表单下拉列表中选择了特定选项,则显示/隐藏字段集。
解决方案概述:您需要将字段集分成两个而不是一个,自定义javascript,在ModelAdmin中定义 Media
类。
[第一步] 在我的名为下拉列表
的项目中,我添加了以下文件夹/文件:
- 静态(目录)
- 静态/下拉(目录)
- 静态/下拉/ js(目录)
- static / dropdown / js / base.js(文件)
[第二步] 在admin.py中,需要注意以下几点:
- 我摔坏了
fieldsets
分成两个而不是一个。 - 注意,我正在为
类
定义每个字段集。abcdefg
是我要显示和隐藏的字段集的类的名称。 - 我定义了
媒体类
。这会告诉django在哪里可以找到自定义的javascript和css文件。
admin.py
from django.contrib import admin
from dropdown.models import DropdownModel
from dropdown.forms import DropdownModelForm
类DropdownModelAdmin(admin.ModelAdmin):
字段集=(
('日期范围',{
'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。
我不相信这个脚本;我只是从此处进行了少许修改。
base.js
(function($) {
$(function(){
var selectField = $('#id_date_range'),已验证的
= $('。abcdefg');
函数toggleVerified (value){
if(value ==='Custom'){
verify.show();
} else {
verify.hide();
}
}
//根据selectField的先前值显示/隐藏负载
toggleVerified(selectField.val());
//显示/隐藏更改
selectField.change(function(){
toggleVerified($(this).val());
});
});
})(django.jQuery);
[第四步]
forms.py
从Django导入从下拉列表中形成
。模型导入DropdownModel
类DropdownModelForm(forms.ModelForm):
类元:
模型= DropdownModel
字段=('date_range',)
小部件= {
'date_range':forms.Select(choices = DropdownModel.CHOICES)
}
In the Django admin, when the choice Custom
is selected from a dropdown list, I want to display the inline start_date
and end_date
fields to allow the user to specify a specific start and end-date instead of a pre-defined time period.
After researching for some time, suggestions include: use hidden fields, define override get_form in ModelAdmin, or use custom Javascript (which I have zero experience with).
The Question: how can I display (show) the inline start_date
and end_date
fields when a specific value (Custom
) is selected in the dropdown of a Django Admin field? When Custom
is not selected, start_date
and end_date
would be hidden from view.
Step 1:
Step 2:
Step 3:
Below is a complete example of the exact example code I have locally:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
...
'dropdown.apps.DropdownConfig',
]
apps.py
from django.apps import AppConfig
class DropdownConfig(AppConfig):
name = 'dropdown'
models.py
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.py
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.py
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)
Purpose of this question: to show / hide a fieldset if a specific option is selected in a Django admin form dropdown.
Solution overview: you need to break fieldsets up into two instead of one, custom javascript, define Media
class in ModelAdmin.
[Step One] In my project named dropdown
, I added the following folders / files:
- static (directory)
- static/dropdown (directory)
- static/dropdown/js (directory)
- static/dropdown/js/base.js (file)
[Step Two] In admin.py, a few things to note:
- I broke
fieldsets
up into two instead of one. - Notice that I'm defining
classes
for each fieldset.abcdefg
is the name of the class of the fieldset I'm trying to show and hide. - I defined
class Media
. This tells django where to look for custom javascript and css files.
admin.py
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)
[Step Three] Add javascript. I take no credit for this script; I only modified it slightly from 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);
[Step Four]
forms.py
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显示/隐藏字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!