我正在开发一个django项目,在注册过程中,用户可以提交代码以获得特别折扣。折扣代码的验证已经很好地工作了,但是我错过了一个美化方面:在用户提交无效代码之后我想清空输入字段;即:
def validate_code(value):
# check code for validity or raise ValidationError
class CodeForm(forms.Form):
code = forms.CharField(validators=[validate_code])
# in my views.py
def code_verification_view(request):
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
# proceed with given code
else:
# modify form to return an empty html input for the code field
# this is where I'm stuck
form.fields['code'].value = ''
# ... render the form in a template
最终结果应该是具有空输入字段的表单,但显示验证错误。如果表单验证失败,行为应该类似于清空密码输入字段的方式。
编辑:我解决了这个问题,但是以一种非常黑客的方式解决了这个问题: 见https://stackoverflow.com/a/46564834/8572938 我很欣赏一个不依赖于访问表单受保护成员的正确解决方案。
答案 0 :(得分:0)
在表单定义中进行字段验证:
class CodeForm(forms.Form):
code = forms.CharField(validators=[validate_code])
def clean_code(self):
code = self.cleaned_data(code)
error = # some of your process
if error:
self.fields['code'] = None
raise forms.ValidationError('...')
else:
return code
然后移除视图中的else
部分,而不想执行其他操作。如果您只想显示包含错误的表单,raise forms.ValidationError
将会执行此操作。
您可以在django表单中添加clean_<field_name>
来控制每个字段。
更多信息here
答案 1 :(得分:0)
只需渲染您的模板,如果您的表单无效,则会显示错误,如果有效处理您的数据
def code_verification_view(request):
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
// process your data
else:
form.data['field'] = None
return render(request, template_name, {'form': form})
答案 2 :(得分:0)
我发现了一种有效的方法,但它很脏:
p*3 if p >=3 else -i*36
这样,我得到了一个包含保留错误的简洁表单。 虽然它完成了这项工作,但它显然是一个丑陋的黑客。
答案 3 :(得分:0)
关键是重置表单变量
form = CodeForm(None)
在您的代码中
def code_verification_view(request):
if request.method == 'POST':
form = CodeForm(request.POST)
if form.is_valid():
# proceed with given code
else:
form = CodeForm(None)