在没有呈现的情况下强制执行表单字段验证和显示错误?



我是django新手,所以一个冗长的答案将不胜感激。我正在对模型中任何新创建的Bottle对象实施capacity限制,如下所示:

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

我的瓶子形状看起来像这样:

class BottleForm(ModelForm):
    class Meta:
        model = Bottle
        fields = '__all__'

我的观点(基于此答案的表单验证逻辑(:

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 }}来显示错误,但这仅在页面已经重新加载并且以非常丑陋的形式显示:见这里。

我想要的是利用 django 的内置弹出错误消息而不重新加载页面(请参阅默认非空字段的示例(,从 UX 的角度来看,这要好得多。

这不是一个 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 }}显示效果要好得多。

最新更新