Как загрузить несколько изображений с помощью 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
возможно), но это поможет вам начать работу.