Django管理表单根据复选框动态更改字段

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

我正在Django中实现一个日历,希望扩展我的功能并添加对重复事件的支持。我的问题是我希望有一个布尔字段,可以在单日/多日事件和重复事件之间切换。因此,该字段将被标记为:这是一个重复事件吗?如果用户选中该框,则会更改开始和结束字段以显示不同的字段

下面是我的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_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