Django:在一个视图中有两种形式

时间:2016-12-19 05:55:01

标签: python django django-forms django-views

如何使用单个表单编写视图以添加新人,并且在同一表单上,可以添加0或1或2或... 68757857同一个人的图像?

请参阅以下代码。

在models.py中:

class Person(models.Model):
    name = models.CharField(max_length=50)

class Image(models.Model):
    person =  models.ForeignKey(Person)
    image = models.ImageField(upload_to='images/')

在forms.py中:

class PersonForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name']

class ImageForm(forms.ModelForm):
    class Meta:
        model = Image
        fields = ['person', 'image']

从我所看到的,使用了formsets。我看了很多关于SO的例子,阅读文档,我仍然感到困惑。

如果有人能够在本问题开头提供符合规范的views.py示例,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用Inline formsets

view.py中,您必须创建一个新的人员实例,然后将此实例与formset一起使用:

from django.forms import inlineformset_factory
ImageFormSet = inlineformset_factory(Person, Image, fields=('image',))

def my_view(request):
    form = PersonForm(request.POST or None)
    if form.is_valid():
        new_person = form.save()
        formset = ImageFormSet(request.POST or None, request.FILES or None, instance=new_person)
        if formset.is_valid():
            formset.save()
            return redirect('persons:main')
    else:
        formset = ImageFormSet(request.POST or None, request.FILES or None)
    return render(request, 'my_template.html', {'formset': formset, 'form': form})

my_template.html

<form action="" method="post" enctype="multipart/form-data">
        {{ form.as_p }}
        {{ formset.management_form }}
        {% for frm in formset %}
            {{ frm.as_p }}
        {% endfor %}   
        <input type="submit" value="Create">
</form>