Сохранение во ManyToManyFields с использованием ModelForm и ModelMultipleChoiceField
Я создал базовое приложение Django, которое содержит книги / авторов / издателей в соответствии с Книгой Django - пытаясь использовать ModelForm для создания средств для изменения существующих книг - проблема заключается в том, что поле "авторы" - это ManyToManyField, и когда я выбрать вариант в ModelForm, он просто стирает существующий выбор и не сохраняет новый?
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()
Потому что вы переопределите authors
поле. Либо не делайте этого, и пусть Django выполняет свою работу, либо обрабатывайте это вручную.