繁体   English   中英

具有多个模型实例的Django表单

[英]Django form with multiple model instances

我正在创建一个Django应用程序,在该应用程序中,我可以从一个页面中将8张图片(具有8个输入字段,其中一个是帖子的主要图片)添加到Blog Post。 我有以下两个模型:

class Pictures(models.Model):
    file_path = models.ImageField(upload_to='posts/', null=True)
    post = models.ForeignKey(BlogPost, on_delete=models.CASCADE, null=True)

class BlogPost(models.Model):
    title = models.CharField(max_length=100)

以及以下形式:

class CratePostForm(forms.Form):
    title = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))

class CreatePicturesPostForm(forms.Form):
    main_image = forms.FileField()
    image_1 = forms.FileField(required=False)
    image_2 = forms.FileField(required=False)
    image_3 = forms.FileField(required=False)
    image_4 = forms.FileField(required=False)
    image_5 = forms.FileField(required=False)
    image_6 = forms.FileField(required=False)
    image_7 = forms.FileField(required=False)

我可以轻松地创建具有以下形式的帖子:

pictures_form = CreatePicturesPostForm(request.POST, request.FILES)

并将每个图片另存为带有Post外键的新Picture对象。 当我要创建表单的编辑页面时,发生了问题,我必须在表单中加载以前上传的图像并将其显示给用户。

我想做以下事情:

pictures_form = EditPicturesAdForm(instance=pictures)

但是此实例应该是单个对象,而我有许多来自同一模型的Pictures对象实例。

任何想法?

在这种情况下,我强烈建议您使用Django Extra Views。 链接

在您的forms.py中:

from extra_views import InlineFormSet


class PicturesInline(InlineFormSet):

        model = Pictures
        extra = 1
        max_num = 8
        fields = ('file_path',)

class BlogPostForm(forms.ModelForm):

    class Meta:
        model = BlogPost
        fields = ('title', )

在您的views.py中:

from extra_views import CreateWithInlinesView, UpdateWithInlinesView

class BlogPostCreateView(CreateWithInlinesView):
    template_name = ''
    model = BlogPost
    form_class = BlogPostForm
    inlines = [PicturesInline, ]
    success_url = ''

class BlogPostUpdateView(UpdateWithInlinesView):
    template_name = ''
    model = BlogPost
    form_class = BlogPostForm
    inlines = [PicturesInline, ]
    success_url = ''

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM