Django

Django — свободный фреймворк для веб-приложений на языке Python

  • You are not logged in.

#1 Aug. 2, 2010 23:56:41

Admin
Registered: 2009-11-16
Posts: 39
Reputation: +  0  -
Profile   Send e-mail  

django-registration и русские ники ( unicode russian username)

Как оказалось, популярный пакет django-registration не поддерживает русские ники - они просто не проходят валидацию. Вся проблема заключается в regexp класса RegistrationForm:
username = forms.RegexField(regex=r'^\w+$',                                                                                                                                         
                                max_length=30,                                                                                                                                          
                                widget=forms.TextInput(attrs=attrs_dict),                                                                                                               
                                label=_("Username"),                                                                                                                                    
                                error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") })


Данные regexp не пропустит наш уникод, поэтому его не плохо было бы заменить на

re.compile(r"^[\w\s-]+$", re.UNICODE)


Самый простой способ - сделать это, изменив код самого django-registration, но это не правильный путь и подойдет только в самом последнем случае. Другой способ, заключается в том, что бы подсунуть django-registration немного измененную форму.Как это сделать - читаем тут. А я же приведу немного кода и магии.

Создаем форму проверяющую наш ник:

import re
from django import forms
from registration.forms import RegistrationFormUniqueEmail
from django.core.validators import RegexValidator
from django.core import validators


class RegistrationFormUtfUsername(RegistrationFormUniqueEmail):
    '''
    Allowed UTF8 logins
    '''
    def __init__(self, *args, **kwargs):
        super(RegistrationFormUtfUsername, self).__init__(*args, **kwargs)
        #после вызова конструктора, у нас уже появился список валидаторов, поэтому его нужно почистить для конкретного поля.
        for v in self.fields['username'].validators:
            if isinstance(v, RegexValidator):
                self.fields['username'].validators.remove(v)
        #предпологаем что ники можно задавать типа "Вася Смирнов", "Лунь-Ночной"
        self.fields['username'].regex = re.compile(r"^[\w\s-]+$", re.UNICODE)
        #устанавливаем новый валидатор
        self.fields['username'].validators.append(validators.RegexValidator(regex=self.fields['username'].regex))



urls.py
from globals.forms import RegistrationFormUtfUsername
....
urlpatterns = patterns('',
....
#registration - тут важен порядок                                                                                                                                                        
    url(r'^accounts/register/$', 'registration.views.register', {'form_class':RegistrationFormUtfUsername, 'backend': 'registration.backends.default.DefaultBackend'}, name='registration_register'),
    (r'^accounts/', include('registration.urls')),
....
)


Учтите, что данный код работает в версией django-registration 0.8. Для 0.7 вовсе не обязательно указывать backend:
url(r'^accounts/register/$', 'registration.views.register', {'form_class':RegistrationFormUtfUsername}, name='registration_register'),


Все теперь вы можете использовать русские символы в username или написать свой валидатор.

Edited Admin (Aug. 3, 2010 02:25:34)

Offline

Board footer

Moderator control

Powered by DjangoBB