【问题标题】:Django Form based on multiple models基于多个模型的 Django Form
【发布时间】:2011-09-12 10:49:07
【问题描述】:

如果我在 Django 应用程序中有两个这样的模型:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=100)

如何创建一个允许您同时添加AuthorBook 的表单。如果系统中存在作者,我可以简单地显示书籍表单并将其链接到作者,但我经常需要允许我的用户同时创建书籍和作者。

我该怎么做?

谢谢。

【问题讨论】:

  • 您可以为用户提供选择作者或创建新作者的选项,然后使用 Ajax 调用创建新作者并修改列表以包含新创建的作者。如果这听起来很有趣,那么我可以提供更多信息。
  • 我想过类似的实现,Ed,但我想尽可能保持 Djangoic。使用 AJAX 方法,我认为我无法使用 Django 的通用 CRUD 视图。
  • @MridangAgarwalla ...您还记得您最终是如何实现的吗?我有一个类似的问题,我需要在管理页面的一个模型表单中添加两个模型。您的解决方案可能对我有所帮助。谢谢。

标签: python django django-models django-forms


【解决方案1】:

您可以编写一个自定义表单,它将检查系统中是否存在作者,使用现有的,如果不存在,则使用提供的名称创建新的。

class CustomForm(forms.ModelForm):
    author = forms.CharField()

    def save(self, commit=True):
       author, created = Author.objects.get_or_create(name=self.cleaned_data['author'])

       instance = super(CustomForm,self).save(commit=commit)
       instance.author = author
       if commit:
          instance.save()
       return instance

    class Meta:
        model=Book

不确定这段代码是否有效,但我想它可以解释我的想法。

【讨论】:

  • 嗨,德米特里。此解决方案适用于我只有一个字段的示例案例。我只是以它为例。当我的 Author 模型有很多字段时,我必须在 ModelForm 中编写每个字段。我正在寻找一种基于两个表单直接创建 ModelForm 的方法,需要重新声明所有字段。谢谢。
【解决方案2】:

您可以创建一个处理多个表单的视图 - 请参阅 http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ 以获得一个很好的示例。

您必须确保表单对象的呈现在模板中完成,只有一个标签和一个提交按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2018-12-10
    • 2018-04-15
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2011-03-12
    • 2012-04-21
    相关资源
    最近更新 更多