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?

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