Добавление сообщения об ошибке проверки в классифицированное представление (CreateView) - PullRequest
0 голосов
/ 18 сентября 2018

В models.py:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='post_pics', blank=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

Я хочу добавить сообщение ValidationError в поле 'image':

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content', 'image']


    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

Если пользователь загружает что-то еще в поле изображения, форма выигралане подходит, но это не так, но я хотел бы добавить дополнительное сообщение типа «Только изображения ...».Идеально сочетать несколько ошибок (размер или разрешение).

Я хотел бы сохранить структуру представления как основанную на классе, поэтому не вдаваясь в forms.py или создавая представление на основе функций.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Так что, похоже, все-таки не нужны валидаторы или повышение ошибок, спасибо Чече за предложение показать дополнительный тег ошибки в шаблоне, поэтому решение довольно простое:

в post_form.html:

.... прямо под {{form}}

{% if form.image.errors %}
  <div class="alert alert-info">
     {{ form.image.errors }}
  </div>
{% endif %}
0 голосов
/ 18 сентября 2018

Вы пытались добавить валидаторы в объявление модели? Например:

    from .validators import validate_image_filesize, validate_image_size, validate_image_name, validate_file_extension
    image = models.ImageField(upload_to='post_pics', blank=True,
                              validators=[validate_image_filesize,
                                          validate_image_size,
                                          validate_image_name,
                                          validate_file_extension])

Определите их в файле validators.py, например:

def validate_file_extension(value):
    extension = os.path.splitext(value.name)[1]
    valid_extensions = ['.jpg', ]
    if not extension.lower() in valid_extensions:
        raise ValidationError(u'Format is not supported, '
                              u'allowed formats: {}'.format(', '.join(valid_extensions)))

Позвольте мнезнать, работает ли это!

...