【问题标题】:Django: New record for manytomany relationship at insertDjango:插入时多对多关系的新记录
【发布时间】:2012-11-23 09:37:38
【问题描述】:

假设我有两个基本类,一个与另一个具有多对多关系:

class Foo(models.Model):
    abc = models.TextField()
    test = models.ManyToManyField(Bar)

class Bar(models.Model):
    zyx = models.TextField()

然后我为 Foo 创建一个 Django 表单:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
        fields = ["abc", "test"]

这将创建一个带有 TextArea 的表单,供我输入新的 Fooabc 变量的值,以及一个将其链接到一个或多个 Bar 对象的列表框。我想为这个特定的表单做的是,而不是 Bar 对象的列表框,能够​​同时创建一个(并且只有一个)新的 Bar(即,显示第二个 TextArea Barzyx 的值),然后将新的 Bar 链接到新的 Foo。 ManyToMany 关系稍后在编辑中出现,但在创建时,我想要一个 Bar 与一个新的 Foo 绑定。

是否可以通过 POST 表单一次性完成所有操作,还是我必须先使用一些 javascript 和 AJAX 来实际创建 Bar,获取它的新 ID,然后链接新的 Foo到那个?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    可能的,但我不确定ModelForm 是否会为您做到这一点。


    不过,您可以自己轻松完成:

    设置表格供用户填写:

    • 创建一个表单让用户输入abc可以ModelForm
    • 从允许用户输入任意数量的zyx 的表单中创建一个formset,以创建相关的Bar 实例。 (同样,ModelForm 的表单集是可以的)

    在处理POST 数据时,请执行以下操作:

    1. 验证表单和表单集是否有效
    2. 插入新实例
    3. 将新的Bar 实例添加到新的FooBar 多对多关系中

    小提示:记住ModelForm.save 返回实例!

    【讨论】:

    • 假设在创建新的 Foo 时我只想要一个新的 Bar,这应该更简单并且不需要表单集,对吗?
    • 由于我的 Bar 只有一个字段,我认为按照您的指南做的最简单的事情就是在 Foo ModelForm ( zyx = forms.CharField(widget=forms.Textarea) ) 下创建一个额外的字段,然后使用它在处理 POST 的视图中创建并链接一个新的Bar。感谢您的帮助!
    • @Joseph 确实如此,但如果您需要将来证明您的代码,使用ModelForm 有时会非常有用,因为它可以节省您只需向@ 添加一个新字段的时间987654339@! :)
    • 你是对的,我已经意识到这一点,因为我需要为第三类做类似的事情,所以我会选择 ModelForm。问题 - 视图中的表单与 request.POST 有何区别? Django 只是知道将正确的数据放入正确的形式中吗?
    • @Joseph 如果表单有不冲突的字段,是的。否则,use the prefix kwarg 实例化表单时!
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 2013-05-02
    • 2019-07-11
    相关资源
    最近更新 更多