【问题标题】:form for simultaneously editing two django models with foreign key relationship用于同时编辑具有外键关系的两个 django 模型的表单
【发布时间】:2018-07-05 07:16:59
【问题描述】:

我试图找到一种简单的方法来创建一个允许同时编辑具有外键关系的两个模型的表单。

经过一番研究,Inline formsets 似乎非常接近我想要做的事情。

django 文档提供了这个例子:

from django.db import models

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

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

然后,

>>> from django.forms import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',))
>>> author = Author.objects.get(name='Mike Royko')
>>> formset = BookFormSet(instance=author)

假设Author 有第二个字段city。我可以使用fields 参数在表单中添加城市吗?

如果内联表单集不是要走的路,还有其他方法可以生成这种联合表单吗?


经过更多研究,我发现 django model Form. Include fields from related models 来自 2009 年,这暗示内联表单集可能不是可行的方法。

如果有不同工厂的默认解决方案,我会非常感兴趣。

【问题讨论】:

  • 嘿,@cel 我想知道,你觉得我的回答有帮助吗?
  • @JohnMoutafis,是的!对不起,我忘了投票:)

标签: python django django-forms


【解决方案1】:

嗯,这与linked post 有点不同,因为那里的关系是OneToOne 而不是ForeignKey

没有 django 工厂(至少我知道)可以自动执行您想要的操作。您可以尝试以下方法:

  • 为依赖表创建ModelForm(本例中为Book):

    class BookForm(forms.ModelForm):
        class Meta:
            model = Book
            fields = ['name', 'city', 'other_field', ...]
    
  • 为依赖表创建inline_formset

    BookFormSet = inlineformset_factory(Author, Book, form=BookForm)
    
  • 在您的视图中使用表单集:

    def my_view(request):
        if request.method == 'POST':
            formset = BookFormSet(request.POST, instance=request.user)
            if formset.is_valid():
                ...
                formset.save()
        else:
            formset = BookFormSet(instance=request.user)
        return render_to_response("template.html", {"formset": formset})
    

    OR 在基于类的视图中:django class-based views with inline model-form or formset

  • 最后在模板中(这部分需要一些摸索才能正确,但这是一个大体思路):

    <form action="." method="post">
        {% csrf_token %}
        {{ formset }}
        {{ formset.management_form }}
        <input type="submit" value="Submit">
    </form>
    

【讨论】:

  • 如何呈现作者简介?它只会显示一种形式,就是书籍?
猜你喜欢
  • 1970-01-01
  • 2015-12-04
  • 2011-11-15
  • 2010-10-29
  • 2020-12-23
  • 2020-11-07
  • 1970-01-01
  • 2014-05-15
  • 2023-01-26
相关资源
最近更新 更多