2

Django Bookに従って本/著者/出版社を含む基本的な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)

ビュー.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()

しかし、まだ運がありません。これほど難しいことはありません。

4

2 に答える 2

2

解決策は、ModelForm の save メソッドをオーバーライドすることでした。

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()
于 2011-10-17T11:06:13.497 に答える
0

authorsフィールドをオーバーライドするためです。それを行わずに Django に任せるか、手動で処理してください。

于 2011-10-13T14:24:57.803 に答える