Django Как загрузить изображение в форму
Вот мой код, связанный с формой:
# models
class Date(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
place = models.ForeignKey('Place', on_delete=models.CASCADE, null=True)
title = models.CharField(max_length=64, null=True)
class Photo(models.Model):
date = models.ForeignKey('Date', on_delete=models.CASCADE)
image = models.ImageField(verbose_name='Photos', upload_to='media/date/photos/')
# view
class CreateDateView(LoginRequiredMixin, CreateView):
template_name = 'app/date/form.html'
form_class = DateForm
def form_valid(self, form):
form.instance.user = self.request.user
form.save() # by the way why do I save this form? Is it okay to save it in form_valid method?
photos = self.request.FILES.getlist('image')
for photo in photos:
Photo.objects.create(image=photo)
return super().form_valid(form)
Проблема в том, как сохранить объекты Photo, если для этого требуется идентификатор модели Date. Возникает ошибка NOT NULL constraint failed: app_photo.date_id. Как я понимаю, я должен написать что-то вроде:
Photo.objects.create(date=date_from_the_form, image=photo)
Но как получить pk из модели Date? Надеюсь, вы поняли мою проблему, если есть вопросы, не стесняйтесь, пишите ниже в разделе комментариев. Заранее спасибо!
Сначала нужно создать объект даты. Кроме того, будет ли каждая дата уникальной? Если да, то вам нужно изменить объявления Meta вашей модели, чтобы включить unique_together.
Вам также нужно избегать цикла for при создании каждого объекта. Это очень дорого, потому что при каждом вызове save() он будет совершать круговое путешествие к базе данных. Для этого и существует bulk_create, который ограничивает ваши обращения к базе данных одной командой для создания многих объектов.
Вот псевдокод для начала работы:
if len(photos) > 0: # don't create a date if there aren't photos
date = Date() # add your arguments
filtered = Date.objects.filter(date=date)
date = date.create() if not filtered.exists() else date = filtered[0] # but this is potentially dangerous if you risk duplicate dates. Only use this if you know it's the correct date
photos = [Photo(date=date,image=p) for p in photos]
Photo.objects.bulk_create(photos)
Удачи!
Вам нужно сохранить объект фотографии:
def form_valid(self, form):
form.instance.user = self.request.user
form.save() # by the way why do I save this form? Is it okay to save it in form_valid method?
photos = self.request.FILES.getlist('image')
for photo in photos:
temp = Photo.objects.create(image=photo)
temp.save()
return super().form_valid(form)