gpt4 book ai didi

python - 同时编辑两个具有外键关系的 Django 模型的表单

转载 作者:行者123 更新时间:2023-12-03 02:09:17 32 4
gpt4 key购买 nike

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

经过一番研究,似乎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 年开始,这暗示内联表单集可能不是正确的选择。

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

最佳答案

嗯,这与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)
  • 在您的 View 中使用表单集:

    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})

    或在基于类的 View 中: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>

关于python - 同时编辑两个具有外键关系的 Django 模型的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453061/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com