在Django中轻松上传多个文件

时间:2019-05-17 07:02:13

标签: python django django-forms image-uploading

我必须创建一个表单来发布带有标题,描述和图像等字段的帖子。我可以用一个图像成功创建一个帖子,但是当涉及多个图像时,它不会被保存。经过研究发现,我必须为图像使用单独的模型和表格。但是我看不到它是如何实现的。那么,我该如何轻松实现这一目标?

Models.py

class news(models.Model):
    title = models.CharField(max_length=100)
    description= models.TextField(max_length=500) 

class newsimages(models.Model):
    image = models.ImageField(upload_to='/images/')
    related = models.ForeignKey(news,on_delete=models.CASCADE,null=True)

1 个答案:

答案 0 :(得分:0)

您可以使用inline_formset

创建表单

class ImageForm(ModelForm):
    class Meta:
        model = newsimages
        exclude = ()

ImageFormSet = inlineformset_factory(news, newsimage, form=ImageForm, extra=1)

您的CreateView类似于:

class NewsCreate(CreateView):
    model = news
    fields = ['title', 'description']
    success_url = some_url

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        ctx['images'] = ImageFormSet(self.request.POST or None)
        return ctx

    def form_valid(self, form):
        ctx = self.get_context_data()
        images = context['images']
        with transaction.atomic():
            self.object = form.save()
            if images .is_valid():
                images.instance = self.object
                images.save()
        return super().form_valid(form)

news_form.html

<form method="post" enctype="multipart/form-data">
    {{ form.as_p }}
    <table>
        {{images.management_form}}
        {% for f in images.forms %}
            {% if forloop.first %}
                <thead>
                    <tr>
                        {% for field in form.visible_fields %}
                            <th>{{ field.label|capfirst }}</th>
                        {% endfor %}
                    </tr>
                 </thead>
             {% endif %}
              <tr class="{% cycle row1,row2 %} formset_row">
                    {% for field in form.visible_fields %}
                        <td>
                            {# Include the hidden fields in the form #}
                            {% if forloop.first %}
                                {% for hidden in form.hidden_fields %}
                                    {{ hidden }}
                                {% endfor %}
                            {% endif %}
                            {{ field.errors.as_ul }}
                            {{ field }}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </table>
        <input type="submit" value="Save"/> 
    </form>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="{% static 'formset/jquery.formset.js' %}"></script>
<script type="text/javascript">
    $('.formset_row').formset({
        addText: 'add image',
        deleteText: 'remove',
        prefix: 'images_set'
    });
</script>

您需要来源jquery.formset.js,我想您会在django admin静态文件中找到它。