我正在Django中实现日历,并希望扩展我的功能并添加对重复事件的支持。我的问题是我想要一个在单/多日事件和重复事件之间切换的BooleanField。因此该字段将被标记为:这是一个反复出现的事件吗?如果用户选中该框,则会更改开始和结束字段以显示不同的字段。
以下是我的model.py
的简要版本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_recurring字段,则动态删除这两个字段并更改表单。这是我的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)
这是我的forms.py
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_field
添加到表单中,尝试一下,但我一直在
为Event指定的未知字段(my_extra_field)。校验 fields / fieldsets / exclude类EventAdmin的属性。
并且无法找到检索我的字段的方法。我的印象可能是因为我使用的是fieldsets
,您可能会建议不要使用它,但不幸的是,我从模型中删除了很多信息以使其更适合于问题和因此我需要使用fieldsets
。
所以为了最终确定我的问题,我想知道如何在我的复选框上动态添加字段库?作为问题的扩展,如何从我的表单中删除2个字段?
答案 0 :(得分:3)
表单上必须存在额外字段,以便您可以在字段集中使用它:
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。