проблема
Добавьте пользовательскую проверку в поле формы в Django 1.3, форма создается общим представлением CreateView.
Модель
class Picture(models.Model):
file = models.ImageField(upload_to=get_image_path)
filename = models.CharField(max_length=50, blank=True)
user = models.ForeignKey(User, editable=False)
upload_date = models.DateTimeField(auto_now_add=True,editable=False)
Общий вид CreateView, немного изменен
class PictureCreateView(CreateView):
model = Picture
def clean_file(self,form):
if image:
if image._size > settings.MAX_IMAGE_SIZE:
raise ValidationError("Image file too large ( > 20mb )")
else:
raise ValidationError("Couldn't read uploaded image")
def get_form(self, form_class):
form = super(PictureCreateView, self).get_form(form_class)
form.instance.user = self.request.user
return form
def form_invalid(self, form):
...omitted none important code...
response = JSONResponse(data, {}, response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
# Called when we're sure all fields in the form are valid
def form_valid(self, form):
...omitted none important code...
response = JSONResponse(data, {}, response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
У меня вопрос: как я могу выполнить пользовательскую проверку в поле файла до того, как будет достигнута form_valid ()?
Короче, что я сделал до сих пор
Согласно документации здесь - https://docs.djangoproject.com/en/dev/ref/forms/validation/
Я должен иметь возможность переопределить поля файла формы валидатора, что я пытаюсь сделать с clean_file ()
«Метод clean_ () в подклассе формы - где заменяется именем атрибута поля формы».
Это было бы легко, если бы я создал форму вручную, но она была создана Django из модели с помощью общего вида.
Мое текущее решение, которое является отвратительным взломом:
Вы можете видеть, что я переопределил form_valid () и form_invalid (), в form_valid () я теперь вызываю clean_file ()
и если это ошибка, я вызываю form_invalid (). Это создает несколько проблем, например, мне нужно вручную создать ответное сообщение об ошибке.