gpt4 book ai didi

没有错误的 Django 表单为 is_valid() 返回 False

转载 作者:行者123 更新时间:2023-12-02 09:19:50 25 4
gpt4 key购买 nike

我正在从元数据生成表单

class MeasureForm(forms.Form):
def __init__(self,*args,**kwargs):
super(MeasureForm,self).__init__()
measure_id = kwargs['measure_id']
m = Measure.objects.get(pk=measure_id);
if (m):
# add the measure identifier as a hidden field
self.fields["measure_id"] = forms.IntegerField(initial = m.id , widget=forms.HiddenInput())
for mp in MeasureParameters.objects.filter(measure = m):
# get the NVL'ed copy of the parameter
p = mp.get_parameter_for_measure()
if not p.is_modifiable:
# the file has a constant value
if (p.values and p.default): # constant must have both values and default index
value_ = p.values[p.values.keys()[p.default-1]];
self.fields[p.name] = forms.IntegerField(
label = p.description ,
initial = value_,
help_text = p.help_text)
self.fields[p.name].widget.attrs['readonly'] = True
else:
raise Exception("Parameter set as unmodifiable but has no value. \
[measure: %s, parameter: %s, measureparameter %s]"
% (m.id , p.id , mp.__unicode__()))
elif (p.values):
# convert hstore dict to list of tuples for the choices to read
values_ = [(v, k) for k, v in p.values.iteritems()];
# set default if exists , else take the first item
default_ = values_[p.default-1][0] if p.default else values_[0][0]
self.fields[p.name] = forms.ChoiceField(
label = p.description ,
choices = values_ ,
initial = default_,
help_text = p.help_text)
else:
self.fields[p.name] = forms.IntegerField(label = p.description, help_text = p.help_text)
if (not p.is_visible):
self.fields[p.name].widget = forms.HiddenInput()
else:
raise Exception ("Could not find measure. [measure %s]" % (m.id))

def clean(self):
return self.cleaned_data;

这是我的观点

def index(request,measure_id = None):

owners = Owner.objects.all()
form = None
result = None
title = None;
msg = None;

# handle the form
if request.method == 'POST': # the form has been submitted
form = MeasureForm(request.POST, measure_id = request.POST.get('measure_id')) # A form bound to the POST data
result = -100
if form.is_valid(): # All validation rules pass
result = 100
msg = "%s" % repr(form.errors) # list of validation errors
else:
if (measure_id):
title = Measure.objects.get(pk=measure_id).name;
# make an unbound form
form = MeasureForm(measure_id = measure_id)

return render(request, 'calc/index.html' ,
{'owners' : owners,
'form' : form ,
'title' : title ,
'result' : result,
'debug' : msg })

这是我的模板的片段

<div class="content">
{{ form.errors }}
{{ form.non_field_errors }}
{% if form %}
<h2>{{ title }}</h2>
<form action="/calc/{{m.id}}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Calculate" />
</form>
{% if result %}
The Result is <span class="result"> {{ result }} </span>
{% endif %}
</div>

所以我得到了空大括号 {} 来表示 "%s"% repr(form.errors)form.errorsform.non_field_errors 不返回任何内容。表单发布,我可以看到请求中的原始数据,但我不断从 is_valid() 得到错误信息。这是为什么 ?

编辑:当检查表单是否已绑定(bind)时,我也会得到错误。猜测这就是问题所在。为什么调用 form = MeasureForm(request.POST,measure_id = request.POST.get('measure_id')) 后表单没有绑定(bind)?

** django 新手,谢谢。

最佳答案

因为您没有将参数传递给 super 调用。你应该这样做:

    super(MeasureForm,self).__init__(*args, **kwargs)

否则,表单将永远不会真正使用 POST 数据进行初始化。

评论后编辑 该问题的答案不建议从 super 调用中删除所有参数。如果您传入 measure_id,您只需事先将其从 kwargs 中删除即可:

def __init__(self, *args, **kwargs):
measure_id = kwargs.pop('measure_id', None)
super(MeasureForm,self).__init__(*args, **kwargs)

关于没有错误的 Django 表单为 is_valid() 返回 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18528932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com