将验证错误消息添加到基于分类的视图(CreateView)

时间:2018-09-18 18:09:26

标签: django django-models django-class-based-views

在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消息:

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)

如果用户在“图像”字段中上载其他内容,则不会提交表单,这很好,但是我想添加一些额外的消息,例如“仅图像..”。理想情况下,合并多个错误(大小或分辨率)。

我想将视图的结构保持为基于类的,因此无需进入form.py或创建基于函数的视图。

谢谢。

2 个答案:

答案 0 :(得分:0)

Have you tried adding the validators into your model declaration?, for example:

    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])

Define them in your validators.py file, for example:

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)))

Let me know if it works!,

答案 1 :(得分:0)

因此,看来似乎根本不需要验证程序或引发错误,谢谢您的建议,以便在模板中显示其他错误标签,因此解决方案非常简单:

post_form.html中的

.... {{form}}下方

{% if form.image.errors %}
  <div class="alert alert-info">
     {{ form.image.errors }}
  </div>
{% endif %}