Django管理表单根据复选框动态更改字段
我正在Django中实现一个日历,希望扩展我的功能并添加对重复事件的支持。我的问题是我希望有一个布尔字段,可以在单日/多日事件和重复事件之间切换。因此,该字段将被标记为:这是一个重复事件吗?如果用户选中该框,则会更改开始和结束字段以显示不同的字段 下面是我的model.py的简要版本Django管理表单根据复选框动态更改字段,django,django-models,django-forms,django-admin,Django,Django Models,Django Forms,Django Admin,我正在Django中实现一个日历,希望扩展我的功能并添加对重复事件的支持。我的问题是我希望有一个布尔字段,可以在单日/多日事件和重复事件之间切换。因此,该字段将被标记为:这是一个重复事件吗?如果用户选中该框,则会更改开始和结束字段以显示不同的字段 下面是我的model.py的简要版本 class Event(models.Model): title = models.CharField(max_length=40) description = models.TextField
class Event(models.Model):
title = models.CharField(max_length=40)
description = models.TextField(blank=True)
is_recurring = models.BooleanField(blank=True, default=False, verbose_name='Event is recurring?')
start = models.DateTimeField()
end = models.DateTimeField()
def __str__(self):
return self.title
如果用户检查is_recurtive字段,则动态删除这两个字段并更改表单。这是我的admin.py:
class EventAdmin(admin.ModelAdmin):
form = EventForm
fieldsets = [
(None, {'fields': [
'title',
'description'
]
}
),
(None, {'fields': [
'is_recurring',
'start',
'end',
]
}
),
] # END fieldset
def get_fieldsets(self, *args, **kwargs):
return(
(None, {
'fields' : ('my_extra_field',),
}),
)
admin.site.register(Event , EventAdmin)
这是我的表格
class EventForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['my_extra_field'] = forms.CharField()
class Meta:
model = Event
所以在这里,我试图向表单中添加my_extra_字段
,尝试一下,但我不断得到
为事件指定的未知字段(my_extra_字段)。检查
EventAdmin类的字段/字段集/排除属性
找不到办法找回我的领域。我有一个印象,这可能是因为我使用的是字段集
,您可能会建议不要使用它,但不幸的是,我从模型中删除了很多信息,使其更适合于一个问题,因此我需要使用字段集
所以,为了完成我的问题,我想知道如何根据我的复选框动态添加字段?作为问题的扩展,如何从我的表单中删除2个字段?表单上必须存在额外的字段,以便您可以在字段集中使用它:
class EventForm(forms.ModelForm):
my_extra_field = forms.CharField()
class Meta:
model = Event
exclude = tuple() # Required in recent Django versions.
# Be careful not to include fields by accident.
您可能必须在表单上覆盖save()
,因为ModelForm
不知道如何处理额外字段
class EventForm(forms.ModelForm):
my_extra_field = forms.CharField()
def save(self, *args, **kwargs):
if self.cleaned_data['is_recurring']:
# do something with your extra fields,
# remove values from other fields, etc.
super(EventForm, self).save(*args, **kwargs)
如果您想在不重新加载页面的情况下更改表单,则需要使用Javascript