Как загрузить несколько изображений с помощью CreateView в Django

У меня есть страница, на которой пользователь может создать пост. Я хочу дать ему возможность добавить несколько изображений к этому посту на той же странице, но я не знаю, как это сделать. Вот мой код:

models.py

class Blog(models.Model):
    ACTIVITY_CHOICES = [
        ('active', 'Active'),
        ('inactive', 'Inactive')
    ]
    title = models.CharField(max_length=100, verbose_name='title')
    description = models.TextField(verbose_name='description')
    tag = models.CharField(max_length=50, verbose_name='tag')
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, verbose_name='author')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    activity = models.CharField(max_length=10, choices=ACTIVITY_CHOICES, default='inactive')

    class Meta:
        verbose_name = 'post'
        verbose_name_plural = 'posts'

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog_detail', args=[str(self.pk)])


class Image(models.Model):
    blog = models.ForeignKey(Blog, default=None, on_delete=models.CASCADE)
    image = models.ImageField(upload_to=user_directory_path)

forms.py

class BlogForm(forms.ModelForm):

    class Meta:
        model = Blog
        fields = '__all__'


class ImageForm(forms.ModelForm):
    file_field = forms.ImageField(widget=forms.ClearableFileInput(attrs={'multiple': 'multiple'}))

    class Meta:
        model = Image
        fields = ('image', )

views.py

class BlogCreateView(CreateView):
    model = Blog
    template_name = 'blog/create_blog.html'
    fields = ['title', 'description', 'tag']

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

create_post.html

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Create post</title>
</head>
<body>
    <h2>Create post</h2>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" value="save">Create post</button>
    </form>
</body>
</html>

Я думаю, что модели, формы и html в порядке, и все, что мне нужно, это внести некоторые изменения в views.py, но что именно, я не знаю.

Вы хотите набор форм.

Checkout ìnlineformset_factory : https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#inline-formsets

Это позволит вам поддерживать несколько записей для модели Image в форме для блога.

FE немного неуклюж, поэтому вам может понадобиться дополнительный JS, если вы хотите заставить его работать более "красивым" способом (или htmx возможно), но это поможет вам начать работу.

Вернуться на верх