Простая загрузка нескольких файлов в Django - PullRequest
0 голосов
/ 17 мая 2019

Мне нужно создать форму, чтобы сделать пост с полями, такими как Название, описание и изображения.Я мог бы успешно создать сообщение с одним изображением, но когда дело касается нескольких изображений, оно не сохраняется.По результатам исследований выяснилось, что я должен использовать отдельную модель и форму для изображений.Но я не вижу, как это достигается во взглядах.Так как мне сделать это простым способом?

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 голосов
/ 17 мая 2019

Вы можете сделать с помощью 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...