python - Django:插入时多对多关系的新记录

标签 python django django-models django-forms

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

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 对象的列表框时间(即,显示 Barzyx 值的第二个 TextArea),然后将新的 Bar 链接到新的 Foo。 ManyToMany 关系稍后在编辑时出现,但在创建时,我希望将一个 Bar 与一个新的 Foo 绑定(bind)。

是否可以通过发布表单一次性完成这一切,或者我是否必须使用一些 javascript 和 AJAX 首先实际创建 Bar,获取其新 ID,然后链接新的 Foo 呢?

最佳答案

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

<小时/>

但是,您可以轻松地自己完成:

设置用户填写的表单:

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

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

  1. 验证表单和表单集是否有效
  2. 插入新实例
  3. 将新的 Bar 实例添加到新的 FooBar ManyToMany 关系
<小时/>

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

关于python - Django:插入时多对多关系的新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13725304/

相关文章:

python - 创建word文档,然后将其附加到电子邮件Django

python - Django 完整性错误

python - 无法通过 `python.subprocess` 管道子进程调整大小和转换 Django `model.save()` 中的图像

python - django-rosetta 翻译的短语没有出现在页面上

python - 无法在 django admin 上发布 - 无法将字节连接到字符串

python - 保存 matplotlib 图形的特定部分

python - Spark DataFrame 的通用 "reduceBy"或 "groupBy + aggregate"功能

python - Django 没有正确连接到 MySQL,抛出 "ImportError: cannot import name ' NULL'"

python - django项目中搜索功能的实现

python - Spyder 快捷方式的目标文件是什么?