2015-06-23 31 views
3

我在Django中實現了一個日曆,並希望擴展我的功能併爲循環事件添加支持。我的問題是我想有一個BooleanField在單/多日事件和循環事件之間切換。所以這個字段會被標記爲:這是一個反覆發生的事件嗎?如果用戶選中此框,它將更改開始和結束字段以顯示不同的字段。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_recurring字段,則動態刪除這些2場,改變形式。這裏是我的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的形式,嘗試一下,但我不斷收到

爲事件指定的未知字段(my_extra_field)。檢查 字段/字段集/排除類EventAdmin的屬性。

找不到方法來檢索我的字段。我有一個印象,可能是因爲我使用fieldsets,你可能想建議不要使用它,但不幸的是,我從我的模型中刪除了很多信息,使它更適合於某個問題,因此我需要使用fieldsets

所以要最終確定我的問題,我想知道如何在我的複選框上動態添加字段庫?並作爲問題的延伸,如何從我的表單中刪除2個字段?

回答

3

額外的字段必須存在的形式,所以你可以在你的fieldsets使用它:

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。

相關問題