2011-10-13 35 views
2

我已經創建了一個基本的Django應用程序,該應用程序包含根據Django書籍的書籍/作者/發佈者 - 嘗試使用ModelForm創建修改現有書籍的方法 - 問題在於'作者'字段是一個ManyToManyField,當我在ModelForm上選擇一個選項時,它只是擦除現有的選擇並且不保存新的選擇?使用ModelForm和ModelMultipleChoiceField保存到ManyToManyFields

models.py

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    authors = models.ManyToManyField2(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication_date = models.DateField() 

    def __unicode__(self): 
     return self.title 

class BookForm(ModelForm): 
    class Meta: 
     model = Book 

    authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all(), required=False) 

views.py

def editBook(request, b=None): 
    instance = None 
    if b is not None: 
     instance = Book.objects.get(title=b) 
    if request.method == 'POST': 
     form = BookForm(request.POST, instance=instance) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/contact/thanks/') 
    else: 
     form = BookForm(instance=instance) 
    return render_to_response('book_form.html', {'form':form}) 

乾杯!

編輯 我剛剛發現了幾個文章,鼓勵在以下views.py

authors = form.save(commit=False) 
authors.user = request.user 
authors.save() 
form.save_m2m() 

但仍然沒有任何運氣 - 不能這麼難!

回答

2

的解決辦法是覆蓋在的ModelForm保存方法:

def save(self, commit=True): 
    authors =[] 
    for a in self.cleaned_data['authors']: 
     authors.append(Author.objects.get(first_name=t.first_name)) 

    b = super(BookForm, self).save(commit=commit) 

    for a in authors: 
     b.authors.add(a) 
    b.save() 
0

因爲您覆蓋authors字段。要麼不這樣做,讓Django做它的工作,或手動處理它。

+0

究竟如何手動處理呢?對於nub問題的歉意,但一直在努力爭取一段時間! – jonseager

+0

@jonseager你爲什麼需要這個?只要刪除這個'authors = ...'行,一切都會按你的意願工作。 – DrTyrsa

+0

我把它刪除了一段時間 - 它仍然沒有保存。表單被正確讀取,因爲我可以輸出的清潔數據到shell,它顯示作者 - 但仍然不實際保存?謝謝你的幫助! – jonseager