2014-06-20 65 views
2

我有一个用Django客户用户模型为用户注册创建的表单有一个奇怪的问题。我正在运行Django 1.6.5。Django Forms cleared_data缺少某些字段

forms.py

class SignupForm(forms.ModelForm): 
    password1 = forms.CharField(widget=forms.PasswordInput, 
           label=_('Password'), 
           max_length=50) 
    password2 = forms.CharField(widget=forms.PasswordInput, 
           label=_('Repeat password'), 
           max_length=50) 

    class Meta: 
     model = RegisteredUser 
     fields = ("firstname", "lastname", "email", "password1", "password2",) 

    def clean_email(self): 
     existing = RegisteredUser.objects.filter(email__iexact=self.cleaned_data['email']) 
     if existing.exists(): 
      raise forms.ValidationError(_('A user with that email already exists.')) 
     return self.cleaned_data['email'] 

    def clean(self): 
     cleaned_data = super(SignupForm, self).clean() 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise forms.ValidationError(_('The two passwords did not match.')) 
     return cleaned_data 

views.py

class SignUpView(FormView): 
    template_name = 'core/signup.html' 
    form_class = SignupForm 
    success_url = None 

    def post(self, request, *args, **kwargs): 
     form = self.get_form(self.get_form_class()) 
     if form.is_valid(): 
      return self.form_valid(request, form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, request, form): 
     new_user = self.register(request, **form.cleaned_data) 
     success_url = self.get_success_url(request, new_user) 

     try: 
      to, args, kwargs = success_url 
      return redirect(to, *args, **kwargs) 
     except ValueError: 
      return redirect(success_url) 



    def register(self, request, **cleaned_data): 
     RegisteredUser.objects.create_user(email=cleaned_data['username'], 
              firstname=cleaned_data['firstname'], 
              lastname=cleaned_data['lastname'], 
              password=cleaned_data['password2']) 

形式返回无效的话说, '密码1' 和 '密码2' 是必填字段。该值与其他字段一起显示在发布数据中。

无论我尝试过什么,'password1'和'password2'都不包含在cleaned_data字典中。我已经尝试在这两个字段中使用各种其他名称,只是为了确保'password2'与其他任何内容没有冲突。

我可能忽视的东西非常简单:-)

谢谢!

迈克

编辑1 - 使用的模板(抱歉DIV-地狱!):

<section class="container"> 
     <div class="row"> 
      <div class="col-md-6 col-sm-6"> 
       <h2>Create an <strong>Account</strong></h2> 
       <form class="white-row" method="post" action="#"> 
        {% csrf_token %} 
        <div class="row"> 
         <div class="form-group"> 
          <div class="col-md-12 col-sm-12"> 
           <label>Firstname</label> 
           <input type="text" class="form-control" name="firstname"> 
          </div> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="form-group"> 
          <div class="col-md-12 col-sm-12"> 
           <label>Lastname</label> 
           <input type="text" class="form-control" name="lastname"> 
          </div> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="form-group"> 
          <div class="col-md-12 col-sm-12"> 
           <label>Email</label> 
           <input type="email" class="form-control" name="email"> 
          </div> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="form-group"> 
          <div class="col-md-6 col-sm-6"> 
           <label>Password</label> 
           <input type="password" class="form-control" name="passsword1"> 
          </div> 
          <div class="col-md-6 col-sm-6"> 
           <label>Repeat password</label> 
           <input type="password" class="form-control" name="passsword2"> 
          </div> 
         </div> 
        </div> 
        <div class="row"> 
         <div class="col-md-12 col-sm-12"> 
          <input type="submit" value="Sign up" class="btn btn-primary pull-right push-bottom" data-loading-text="Loading..."> 
         </div> 
        </div> 
       </form> 
      </div> 
+0

能告诉你检查精确字段错误的模板?您在使用表格的地方,因为它抱怨说您没有填写好表格,并且您在模板中执行此操作 – AlvaroAV

+0

我更新了模板。我得到的错误是password1和password2是必需的。这两个字段都是外地字段,并且(如提及的)出现在请求对象中的发布数据中。 – MikeSDNielsen

+0

我想你对django表单有个误解,你在哪里使用'{{form}}'变量?你在哪里调用'{{form.password1}}和'{{form.password2}}'?您正在使用标准输入,html输入' AlvaroAV

回答

1

这是我如何做到这一点在我的项目的例子:

forms.py:

class NewUserForm(forms.Form): 
    username = ... 
    password1 = forms.CharField(widget=forms.PasswordInput, required=True) 
    password2 = forms.CharField(widget=forms.PasswordInput, required=True) 

    def clean_password2(self): 
     password1 = self.cleaned_data.get("password1", "") 
     password2 = self.cleaned_data.get("password2", "") 
     if password1 and password2: # If both passwords has value 
      if password1 != password2: 
       raise forms.ValidationError(_(u"Passwords didn't match.")) 
     else: 
      raise forms.ValidationError(_(u"Passwords can't be blank.")) 
     return password2 

views.py:

@login_required 
def add_user(request): 
    ''' Adds new user ''' 

    if request.method == 'POST': 
     form = NewUserForm(request.POST) 
     if form.is_valid(): 
      user = form.save() 
      # TODO: Save in temporary table 
      return HttpResponse('SUBMIT') 
    else: 
     form = NewUserForm() 

    return render_to_response('add_user.html', {'form': form}, context_instance=RequestContext(request)) 

模板(表格为例):

<form action="." method="post" id="add_user_form"> 
{% csrf_token %} 
    {{ form.username }} 
    {{ form.password1 }} 
    {{ form.password2 }} 
    {{ form.usertype }} 

    <input type="submit" value="{% trans 'Save' %}" class="default"/> 

</form> 

{% csrf_token %}:你需要把这个在每一个形成使用

action=".":这让后到实际页面

{{ form.VARIABLE_NAME}}你需要像这样设置表单的输入,在视图中创建表单,发送到模板,并使用{{ }}作为Django变量。要设置输入你的领域之一,像password1它会像我上面{{ form.password1}}写的,你也可以使用{{form.errors}}检查所有形式的错误,或{{form.VARIABLE_NAME.errors}}模板