【问题标题】:Return error message to custom form in Django将错误消息返回到 Django 中的自定义表单
【发布时间】:2015-08-13 22:34:16
【问题描述】:

我的自定义注册表单中的字段如下所示:

<div class="form-group">
          {{ form.email.errors }}
        label for="{{form.email.id_for_label}}">
        <b>Email</b>
        </label>
          {{ form.email }}
</div>

我的 views.py 看起来像这样:

def registration(request):
    registered = False
    if request.method == 'POST':
        form = RegForm(data=request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            phone = form.cleaned_data['phone']
            password = form.cleaned_data['password']
            password2 = form.cleaned_data['password2']
            user = User()
            user.email = email
            user.username = email
            user.is_active = False
            user.set_password(password)
            user.save()
            return render(request, 'appname/index.html', {'registered': True})
    else:
        form = RegForm()
        render(request, 'appname/index.html', {'form': form})

forms.py:

class RegForm(forms.Form):
    email = forms.EmailField(error_messages={'required': 'Please enter your Email ID'})
    password=forms.CharField(widget=forms.PasswordInput())
    password2=forms.CharField(widget=forms.PasswordInput())
    phone= forms.CharField(label="Mobile Number",max_length=10)

#clean email field
    def clean_email(self):
        email = self.cleaned_data["email"]
        try:
            User._default_manager.get(email=email)
        except User.DoesNotExist:
            return email
        raise forms.ValidationError('duplicate email')

假设数据库中已经存在电子邮件,如何将错误消息返回到自定义表单并显示它以代替{{form.email.errors}}

编辑
我在 forms.py 中使用了 ValidationError 并返回 raise forms.ValidationError('duplicate email') 如果电子邮件存在。如何在自定义表单中显示此错误?

【问题讨论】:

    标签: python django forms django-models django-forms


    【解决方案1】:

    回答我自己的问题。我是一个新手,因此花了很多时间和精力来解决这个问题。 我只是在我的观点中错过了这一点:

    if form.is_valid():
        #do something, add user ot DB
        return render(request, 'mudramantri/index.html', {'registered': True})
    else:
        return render(request, 'mudramantri/index.html', {'form': form})
    

    由于表单无效时我没有返回表单,因此视图为空,因此出现错误。

    【讨论】:

      【解决方案2】:

      视图的逻辑似乎有问题。

      当表单被评估form.is_valid() 时,ValidationError 将被引发并且错误将出现在表单中。

      如果表单无效,它似乎没有返回任何内容,或者使模板中的错误可用。

      def registration(request):
          registered = False
          if request.method == 'POST':
              form = RegForm(data=request.POST)
              if form.is_valid():
                  email = form.cleaned_data['email']
                  phone = form.cleaned_data['phone']
                  password = form.cleaned_data['password']
                  password2 = form.cleaned_data['password2']
                  user = User()
                  user.email = email
                  user.username = email
                  user.is_active = False
                  user.set_password(password)
                  user.save()
                  return render(request, 'appname/index.html', {'registered': True})
          else:
              form = RegForm()
          return render(request, 'appname/index.html', {'form': form})
      

      而且标签似乎缺少一个开头&lt;

          <div class="form-group">
            {{ form.email.errors }}
          <label for="{{ form.email.id_for_label }}">
          <b>Email</b>
          </label>
            {{ form.email }}
          </div>
      

      作为旁注,我建议在成功创建用户后使用GET 请求重定向用户,以避免任何用户意外点击重新加载并发送另一个有效负载。例如

      return redirect('/confirmation/')
      

      【讨论】:

      • 嘿,你能告诉我正确的注册视图应该是什么吗?你的答案和我的不一样吗?我应该如何处理 ValidationError?
      • 不同之处在于您没有将表单作为上下文的一部分返回。正如您在标记为有效的答案中提到的那样。
      【解决方案3】:

      您可以为RegForm 中的email 字段编写自定义清理程序。比如:

      class RegForm(forms.Form):
          # Everything as before.
          ...
      
          #clean email field
          def clean_email(self):
              email = self.cleaned_data["email"]
              if User.objects.filter(email=email).exists():
                  raise forms.ValidationError('duplicate email')
              return email
      

      这已记录在here

      【讨论】:

      • 是的,我做到了。但是如何将该错误返回到我的表单?
      • 如果方法正确,会显示在{{ form.email.errors }}。这只是一个字段错误。如果您分享您的 forms.py 会很有帮助
      • 我刚刚分享了它。请看一下?
      • 我不应该在 HTTPResponse 某处返回错误而不是表单吗?我不确定具体在哪里。
      • 我更新了我的答案。您的视图已经返回响应。上面的方法只清理email字段,将清理后的数据传回视图。
      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2011-08-28
      相关资源
      最近更新 更多