实施表单字段验证&显示错误没有渲染?

时间:2017-05-22 18:43:53

标签: django django-models django-forms django-validation

我是一个django新手,所以我将非常感谢您的回答。我对模型中任何新创建的capacity对象强制实施Bottle限制,如下所示:

class Bottle(models.Model):
    name = models.CharField(max_length=150, blank=False, default="")
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name="bottles")
    vintage = models.IntegerField('vintage', choices=YEAR_CHOICES, default=datetime.datetime.now().year)
    capacity = models.IntegerField(default=750,
                                   validators=[MaxValueValidator(2000, message="Must be less than 2000")
                                    ,MinValueValidator(50, message="Must be more than 50")])

我的BottleForm看起来像这样:

class BottleForm(ModelForm):

    class Meta:
        model = Bottle
        fields = '__all__'

我的观点(基于表单验证逻辑on this answer):

def index(request):
    args = {}

    user = request.user
    object = Bottle.objects.filter(brand__business__owner_id=user.id).all(). \
    values('brand__name', 'name', 'capacity', 'vintage').annotate(Count('brand')).order_by('brand__count')

    args['object'] = object

    if request.method == "POST":
        form = BottleForm(request.POST)

        if form.is_valid():
            bottle = form.save(commit=False)
            bottle.save()
            return redirect('index')

    else:
        form = BottleForm()
    args['form'] = form
    return render(request, template_name="index.pug", context=args)

我的模板(pug格式),如下:

            form(class="form-horizontal")(method="post" action=".")
                | {% csrf_token %}
                for field in da_form
                    div(class="form-group")
                        label(class="col-lg-3 col-md-3 col-sm-3 control-label") {{field.label_tag}}
                        div(class="col-lg-9 col-md-9 col-sm-9")
                            | {{ field|add_class:"form-control" }}
                input(class="btn btn-primary")(type="submit" value="submit")

在弄乱我的代码并浏览SO几个小时之后,我设法通过向我的模板添加{{ form.errors }}来显示错误,但这只会在页面重新加载后以非常丑陋的形式显示:see here

我喜欢的是使用django的内置popover错误消息而无需重新加载页面(see example on default non-empty field),这从UX的角度来看要好得多。

1 个答案:

答案 0 :(得分:1)

这不是Django消息。这是一条HTML5验证邮件,由您的浏览器直接强制执行。 Django只输出输入字段作为带有max属性的类型号:

<input type="number" name="capacity" max="750">

我不确定你的(可怕的)哈巴狗模板事物是否会阻碍,或者是否只是当你使用验证器时Django没有传递这些参数。您可能需要在表单中重新定义字段,指定最大值和最小值:

class BottleForm(ModelForm):
    capacity = forms.IntegerField(initial=750, max_value=2000, min_value=250)

(注意,无论如何,在每个字段旁边执行{{ field.errors }}会比在顶部执行{{ form.errors }}提供更好的显示效果。)