【问题标题】:Simple form not validating简单的表单不验证
【发布时间】:2011-03-12 01:39:04
【问题描述】:

我在 stackoverflow 上找到了一种使用信号扩展 django 内置身份验证的方法。我的基本用户由“电子邮件”和密码定义(所以那里没有用户名)。所以我试图根据我的需要对其进行修改,但我的表单出现验证错误。奇怪的是,错误与 User.email 字段相关联,即使我目前只是在注册,我也“已经在使用”。它是试图保存它 2 次还是什么?当我将带有数据的字典发送到 shell 中的表单构造函数时,我发现了它:form = MyForm(data={})。在此表单仍然无效之后,但将电子邮件更改为不同的值最终给了我 True。

连接注册信号的user_created函数:

def user_created(sender, user, request, **kwargs):
    form = CustomRegistrationForm(request.POST, request.FILES)
    if form.is_valid():
        data = UserProfile(user=user)
        data.is_active = False
        data.first_name = form.cleaned_data['first_name']
        data.last_name = form.cleaned_data['last_name']
        data.street = form.cleaned_data['street']
        data.city = form.cleaned_data['city']
        data.save()
    else:
        return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))

user_registered.connect(user_created)

我的表格:

class CustomRegistrationForm(RegistrationForm):
    first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)

我的模特:

class UserProfile(models.Model):
    first_name = models.CharField(_("Name"), max_length=50, blank=False,)
    last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
    street = models.CharField(_("Street"), max_length=50, blank=False,)
    city = models.CharField(_("City"), max_length=50, blank=False,) 
    user = models.ForeignKey(User, unique=True, related_name='profile',)

报名表: 类RegistrationForm(forms.Form):

email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
                                                           maxlength=75)),
                         label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo powtorzone"))

def clean_email(self):
    email = self.cleaned_data.get("email")
    if email and User.objects.filter(email=email).count() > 0:
        raise forms.ValidationError(
            _(u"Already in use."))
    return email

【问题讨论】:

    标签: django django-forms validation django-signals django-registration


    【解决方案1】:

    您的 'user_registered' 信号在用户保存后发送。所以它已经定义了一个“电子邮件”字段。

    更新


    使用不安分的思维:

    form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)
    

    形式:

    def __init__(self, *args, **kwargs):
        self.notvalidateemail = kwargs.pop('notvalidateemail',False)
        super(CustomRegistrationForm, self).__init__(*args, **kwargs)
    
    def clean_email(self):
        if self.notvalidateemail:
            return
        else:
            #your cleaning here
            return email
    

    【讨论】:

      【解决方案2】:

      问题:

      您的表单首先由 django-registration 保存。然后在 user_created 中再次保存。

      解决方案:

      1. 在 user_created 中使用不同的表单。一个尚未保存的字段(这些来自用户模型,如电子邮件)。你只是想在 user_created 中保存额外的数据,对吧?

      2. 在表单中添加一些参数,例如:

      在 user_created 中:

      form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)
      

      在表单的init中;

      self.dontvalidateemail = dontvalidateemail
      

      然后在 clean_email 中检查它。

      【讨论】:

        猜你喜欢
        • 2011-05-18
        • 2013-05-19
        • 2013-11-16
        • 2012-01-15
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多