如何在提交

时间:2017-10-03 13:30:23

标签: django forms

我正在开发一个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 我很欣赏一个不依赖于访问表单受保护成员的正确解决方案。

4 个答案:

答案 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)