【问题标题】:Saving to ManyToManyFields using ModelForm and ModelMultipleChoiceField使用 ModelForm 和 ModelMultipleChoiceField 保存到 ManyToManyFields
【发布时间】:2011-10-13 14:17:34
【问题描述】:

我创建了一个基本的 Django 应用程序,其中包含根据 Django Book 的书籍/作者/出版商 - 尝试使用 ModelForm 创建修改现有书籍的方法 - 问题是“作者”字段是 ManyToManyField当我在 ModelForm 上选择一个选项时,它只会擦除现有的选择而不保存新的选择?

模型.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()

但仍然没有任何运气 - 不可能这么难!

【问题讨论】:

    标签: python django manytomanyfield modelform


    【解决方案1】:

    解决方案是覆盖 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()
    

    【讨论】:

      【解决方案2】:

      因为您覆盖了authors 字段。要么不做,让 Django 完成它的工作,要么手动处理。

      【讨论】:

      • 您究竟是如何手动处理的?为小问题道歉,但为此苦苦挣扎了一段时间!
      • @jonseager 为什么需要这个?只需删除此 authors = ... 行,一切都会按您的意愿进行。
      • 我不久前删除了它 - 它仍然没有保存。表格被正确读取,因为我可以将cleaned_data输出到shell并显示作者 - 但实际上仍然没有保存?感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2015-09-09
      • 1970-01-01
      相关资源
      最近更新 更多