Добавление пользовательской проверки в поле для универсального представления CreateView - PullRequest
3 голосов
/ 17 марта 2012

проблема

Добавьте пользовательскую проверку в поле формы в 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 (). Это создает несколько проблем, например, мне нужно вручную создать ответное сообщение об ошибке.

1 Ответ

5 голосов
/ 17 марта 2012

Почему бы не создать свою модель ?

from django import forms

class PictureForm(forms.ModelForm):
    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")

    class Meta:
        model = Picture

Тогда вы можете использовать его в своем представлении с атрибутом form_class :

class PictureCreateView(CreateView):
    form_class = PictureForm

    # .... snip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...