用于同时编辑具有外键关系的两个django模型的表单

时间:2018-01-25 22:39:10

标签: python django django-forms

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

经过一些研究,似乎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参数在表单中添加城市吗?

如果内联表单集不是可行的方法,是否有另一种方法可以生成此联合表单?

经过一些研究后,我发现2009年django model Form. Include fields from related models提示内联表单集可能不是最佳选择。

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

1 个答案:

答案 0 :(得分:2)

嗯,这与linked post略有不同,因为关系是OneToOne而不是ForeignKey

没有django工厂(至少我知道)自动做你想做的事。您可以尝试以下方法:

  • 为依赖表创建ModelForm(在这种情况下为Book):

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

    BookFormSet = inlineformset_factory(Author, Book, form=BookForm)
    
  • 在视图中使用formset:

    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>