Jar*_*rad 9 python django django-forms django-admin
在Django管理员中,当Custom从下拉列表中选择选项时,我想显示内联start_date和end_date字段以允许用户指定特定的开始和结束日期而不是预定义的时间段.
经过一段时间的研究,建议包括:使用隐藏字段,在ModelAdmin中定义覆盖get_form,或使用自定义Javascript(我没有经验).
问题:当在Django Admin字段的下拉列表中选择特定值()时,如何显示(显示)内联start_date和end_date字段Custom?当Custom没有被选择,start_date并且end_date将从视图中隐藏.
下面是我在本地的确切示例代码的完整示例:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
...
'dropdown.apps.DropdownConfig',
]
Run Code Online (Sandbox Code Playgroud)
apps.py
from django.apps import AppConfig
class DropdownConfig(AppConfig):
name = 'dropdown'
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
此问题的目的:如果在Django管理表单下拉列表中选择了特定选项,则显示/隐藏字段集.
解决方案概述:您需要将Media字段集分成两个而不是一个自定义javascript,在ModelAdmin中定义类.
[第一步]在我命名的项目中dropdown,我添加了以下文件夹/文件:
[第二步]在admin.py中,需要注意以下几点:
fieldsets分成了两个而不是一个.classes为每个fieldset 定义.abcdefg是我试图显示和隐藏的字段集的类的名称.class Media.这告诉django在哪里寻找自定义的javascript和css文件.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)
Run Code Online (Sandbox Code Playgroud)
[第三步]添加javascript.我不赞成这个剧本; 我只是从这里略微修改它.
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);
Run Code Online (Sandbox Code Playgroud)
[第四步]
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3982 次 |
| 最近记录: |