【问题标题】:Adding validation error message to class-based view (CreateView)将验证错误消息添加到基于类的视图 (CreateView)
【发布时间】:2019-02-22 19:58:00
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 您是否考虑过将FileField 与自定义验证器一起使用?有关想法,请参阅 this answer

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


【解决方案1】:

您是否尝试将验证器添加到您的模型声明中?例如:

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

让我知道它是否有效!,

【讨论】:

  • 感谢您的评论,我实现了您提出的解决方案,html 处理表单的行为是相同的。我不完全确定是否需要在模板中“捕获”这些 ValidationErrors,或者它们是否应该像 django 中的所有其他错误消息一样弹出(意味着无需任何用户干预)。
  • 确保在模板中显示字段错误。这个link 可能会对你有所帮助。
【解决方案2】:

看来毕竟不需要验证器或引发错误,谢谢 Cheche 建议在模板中显示额外的错误标签,所以解决方案非常简单:

在 post_form.html 中:

.... {{ 表单 }}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2018-05-15
    • 2017-11-07
    • 1970-01-01
    • 2017-12-31
    • 2023-03-11
    • 2014-01-22
    相关资源
    最近更新 更多