Django CreateView: Как/где внедрить дополнительное поле формы до вызова Model.Clean()?
Я создал следующую модель Django:
class CoachGalleryImage(models.Model):
image = models.ImageField(
null=False,
blank=None,
validators=[validate_gallery_img_dimensions]
)
coach = models.ForeignKey(Coach, on_delete=models.CASCADE, null=False)
created_on = models.DateField(default=timezone.now)
def clean(self):
if CoachGalleryImage.objects.filter(coach=self.coach).count() > 3:
raise ValidationError("You have reached your gallery image upload limit")
Обратите внимание на дополнительную валидацию, предоставляемую в методе 'clean()'.
У меня есть CreateView, который позволяет пользователю загрузить изображение галереи, основанный на модели выше. Пользователь предоставит поле 'image', а поле 'coach' будет назначено программно.
class CoachGalleryUploadView(CreateView):
template_name = "coach_gallery_upload.html"
model = CoachGalleryImage
fields = ["image"]
def form_valid(self, form):
form.instance.coach = self.request.user.coach
return super().form_valid(form)
Когда пользователь размещает форму, возникает следующая ошибка:
У CoachGalleryImage нет тренера. /coach/models.py, строка 120, in clean
.if CoachGalleryImage.objects.filter(coach=self.coach).count() > 3:
Проблема заключается в том, что хотя я добавляю поле 'coach' к экземпляру формы, в CreateView's form_valid(), метод .clean() модели CoachGalleyImage вызывается до того, как это произойдет. Поскольку поле .coach по-прежнему равно null, когда вызывается метод модели .clean(), это приводит к тому, что пользовательское правило валидации выбрасывает исключение.
Я знаю, что могу перенести логику пользовательской валидации в CreateView, однако я хотел бы сохранить ее на уровне модели, так как в этом случае она останется эффективной при использовании администрирования сайта Django.
Итак, мой вопрос в том, что касается использования CreateView, где я могу ввести поле 'coach', чтобы оно существовало к тому времени, когда Django вызовет метод .clean() на модели CoachGalleryImage?