cel*_*cel 5 python django django-forms
我试图找到一种简单的方法来创建允许同时编辑具有外键关系的两个模型的表单。
经过一些研究,似乎内联表单集非常接近我想要做的。
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)
Run Code Online (Sandbox Code Playgroud)
进而,
>>> from django.forms import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book, fields=('title',))
>>> author = Author.objects.get(name='Mike Royko')
>>> formset = BookFormSet(instance=author)
Run Code Online (Sandbox Code Playgroud)
让我们假设Author有第二个字段,city。我可以使用fields参数在表单中添加一个城市吗?
如果内联表单集不是要走的路,是否有另一种方法可以生成这种联合表单?
经过更多的研究,我找到了django 模型表单。包括来自 2009 年相关模型的字段,这暗示内联表单集可能不是要走的路。
如果有不同工厂的默认解决方案,我会非常感兴趣。
嗯,这与链接的帖子有点不同,因为那里的关系是 aOneToOne而不是 a ForeignKey。
没有 django 工厂(至少据我所知)可以自动执行您想要的操作。您可以尝试以下方法:
ModelForm为依赖的表创建一个(Book在本例中):
class BookForm(forms.ModelForm):
class Meta:
model = Book
fields = ['name', 'city', 'other_field', ...]
Run Code Online (Sandbox Code Playgroud)inline_formset为依赖的表创建一个:
BookFormSet = inlineformset_factory(Author, Book, form=BookForm)
Run Code Online (Sandbox Code Playgroud)在您的视图中使用表单集:
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})
Run Code Online (Sandbox Code Playgroud)
或者在基于类的视图中:具有内联模型表单或表单集的 django 基于类的视图
最后在模板中(这部分需要一些摸索才能正确,但这是一个总体想法):
<form action="." method="post">
{% csrf_token %}
{{ formset }}
{{ formset.management_form }}
<input type="submit" value="Submit">
</form>
Run Code Online (Sandbox Code Playgroud)