代码之家  ›  专栏  ›  技术社区  ›  shacker kravietz

使用django注册禁用django 1.2中的电子邮件样式用户名

  •  2
  • shacker kravietz  · 技术社区  · 16 年前

    django 1.2允许用户名采用电子邮件地址的形式。

    在django 1.2中更改:用户名可能 现在包含@、+、。和-字符

    我知道这是一个很受欢迎的特性,但是如果你不想要新的行为呢?它会导致配置文件URL中的用户名混乱,并且似乎会破坏django注册(如果用户使用电子邮件样式的用户名注册帐户,django注册激活电子邮件中的链接将返回404)。

    是否有人有恢复旧行为和禁用电子邮件样式用户名的方法?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Yuval Adam    16 年前

    没有直接的方法可以恢复到以前的行为。

    处理这种情况的最简单方法是根据您的需求强制客户端和服务器端验证用户名。Django注册不是一个积极开发的组件,我不会指望从那个方向来的任何东西。只需在您这边添加一些额外的验证。

    引用雅各伯 on this matter :

    […]另一个常见请求是允许 使用电子邮件地址作为用户名。

    自定义注册/注册表格可以 处理进一步的限制。

        2
  •  1
  •   shacker kravietz    16 年前

    其实django注册并不是问题所在。问题是我已经将它的注册表子类化了,用新的帮助文本重新定义了用户名字段。这样做,我就阻止了它使用自己的regex字段。为了解决这个问题,我必须将注册表中的一些零碎部分放入我的EnhancedRegistrationForm子类中。

    请注意regex行,它反映了旧式用户名字符限制(这是我想要的)。

    from registration.forms import RegistrationForm   
    
    # Carry these over from RegistrationForm - needed in the form definition below
    attrs_dict = {'class': 'required'}
    from django.utils.translation import ugettext_lazy as _
    
    class EnhancedRegistrationForm(RegistrationForm):
        first_name = forms.CharField(label='first name', max_length=30, required=True)
        last_name = forms.CharField(label='last name', max_length=30, required=True)    
        username = forms.RegexField(regex=r'^\w+$',
            max_length=30,
            widget=forms.TextInput(attrs=attrs_dict),
            help_text='Email addresses cannot be used as usernames.', 
            required=True,
            label=_("Username"),
            error_messages={'invalid':"You cannot use an email address as a username, sorry."})    
    
        class Meta:
            fields = ('first_name','last_name','username','email','password1','password2')  
    
    
        def save(self, *args, **kwargs):
            """
            Overriding save, so call the parent form save and return the new_user
            object.
            """
            new_user = super(EnhancedRegistrationForm, self).save(*args, **kwargs) 
            new_user.first_name = self.cleaned_data['first_name']
            new_user.last_name = self.cleaned_data['last_name']
            new_user.save()
            return new_user   
    
    推荐文章