2009-12-02 49 views
2

我有一個模型日曆和表單,我希望能夠創建它的多個實例。如何使用ModelMultipleChoiceField保存表單?

這裏是我的模型:

class Event(models.Model): 
    user = models.ForeignKey(User) 

class Group(models.Model): 
    name = models.CharField(_('Name'), max_length=80) 
    events = models.ManyToManyField(Event, through='Calendar') 

class Calendar(models.Model): 
    event = models.ForeignKey(Event) 
    group = models.ForeignKey(Group) 

class CalendarInline(admin.TabularInline): 
    model = Calendar 
    extra = 1 

class GroupAdmin(admin.ModelAdmin): 
    inlines = (CalendarInline,) 

這裏是我嘗試編寫自己的狀態:

class AddEventToGroupForm(ModelForm): 
    group = ModelMultipleChoiceField(queryset=Group.objects.all(), widget=SelectMultiple()) 

    def save(self): 
     for g in self: 
      g.save() 

    class Meta: 
     model = Calendar 
     fields = ('group',) 

這裏是我的觀點的一部分:

e = Event.objects.get(id=event_id) 
calentry = Calendar(event=e) 
if request.POST: 
    f = AddEventToGroupForm(data=request.POST, instance=calentry) 
    if f.is_valid(): 
     f.save() 

如果我嘗試提交該表格,我得到:

AttributeError at /groups/add_event/7/ 

'BoundField' object has no attribute 'save' 

在此 的情況下創建多個日曆實例的正確方法是什麼?

回答

2

這不是如何處理形式中的多對多關係。你不能遍歷表單中的字段並保存它們,它確實不能這樣工作。

在這種形式下,只有一個字段,它恰好有多個值。這裏要做的是迭代這個字段,你可以在cleaned_data字典中找到(當表單有效時)。

所以,在你看來,你做這樣的事情:你是不是「節約」的AddEventToGroupForm形式在所有

if f.is_valid(): 
    for group in f.cleaned_data['group']: 
     calentry.groups.add(group) 

注意。我將它作爲一個標準的forms.Form,而不是ModelForm,因爲你不是真的依賴於任何ModelForm的功能。

相關問題