我是一个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的角度来看要好得多。
答案 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 }}
提供更好的显示效果。)