django - 如何正确地使用 ManyToManyField 覆盖模型的 ModelForm 的 save() 方法

标签 django django-models django-forms

考虑我已经定义了以下模型:

class Tag(models.Model):
  name = models.CharField(max_length=20)

class Entry(models.Model):
  title = models.CharField(max_length=100)
  date = models.DateField()
  tags = models.ManyToManyField(Tag)

以及以下模型形式:

class EntryForm(forms.ModelForm):
  tags =  CharField(max_length=100, label='Tags', required=False)
  class Meta:
    model = Entry

基本上我有一个带有标签的条目。标签不一定已经创建。我需要收到填写完毕的报名表并用标签保存。

如果条目中没有 ManyToMany 关系,我可以轻松做到这一点。但有了它,我首先需要保存标签,然后将保存的标签添加到条目中,然后保存条目。这意味着我必须重写 EntryForm 的 save() 方法。

我看到了this已经有问题了,但看起来有所不同。就我而言,我只需要保存标签,其余的应该能够使用 ModelForm 的默认 save()。

我提出了一个简化的例子。在真实的情况下,我的条目中有更多字段。 对于以 django 方式编写 EntryForm 的 save() 方法,您有何建议?

最佳答案

我认为你可以在保存标签后调用 super 。也许您需要在创建条目后追加到该条目。

def save(self, commit=True):
    # do custom stuff
    tags =[]
    for t in self.cleaned_data['tags'].split(','):
         tags.append(Tag.objects.get_or_create(name=t))
    # save entry
    e = super(EntryForm, self).save(commit=commit)

    for t in tags:
        e.tags.add(t)

关于django - 如何正确地使用 ManyToManyField 覆盖模型的 ModelForm 的 save() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3971964/

相关文章:

django - 加载示例 django-bootstrap3 模板时出错

python - Django 表单中的隐藏字段不在 cleaned_data 中

django - 如何将 Django 的 GenericForeignKey 限制为模型列表?

DjangoCMS,在 CMS 模板之外使用片段

python - Jenkins 构建的 Django 应用程序的 Docker 容器中的错误时间

python - 在参数中使用带有 unicode 字符的 {% url %} 反向 (Django)

django - ValueError : Related model u'app. 模型'无法解析

django - django 查询中 ImageField 的 Url

django - 在Django过滤器语句中,__exact和等号(=)有什么区别?

python - 如何在 django 自定义管理页面添加默认添加用户页面?