Leave a Comment
Работа со стандартной авторизацией в Django
Хотелось использовать стандартную авторизацию, но нужно было, естественно, её расширить.
Вот как это получилось.
Добавки в файлы:
Файл models.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# стандартный пользователь Django from django.contrib.auth.models import User ... # расширяем модель пользователя class UserProfile( models.Model ): user = models.ForeignKey( User, null = True ) birthday = models.DateField( blank = True, null = True ) weight = models.IntegerField( blank = True, null = True ) height = models.IntegerField( blank = True, null = True ) language = models.CharField( max_length = 2, choices = LANGUAGES, default = 'ru' ) created_at = models.DateTimeField( auto_now_add = True ) updated_at = models.DateTimeField( auto_now = True ) ... # автолинкование профиля пользователя к пользователю при его сохранении def user_post_save(sender, instance, **kwargs): ( profile, new ) = UserProfile.objects.get_or_create(user=instance) models.signals.post_save.connect(user_post_save, sender=User) |
Файл urls.py
1 2 3 4 5 |
from main.views import ... signup, login, logout, my_profile, user_card ... url( r'^accounts/signup/$', signup ), url( r'^accounts/login/$', 'django.contrib.auth.views.login', { "template_name": "accounts/login.html" } ), url( r'^accounts/logout/$', 'django.contrib.auth.views.logout_then_login' ), |
Логин и логаут — стандартные, а регистрация — своя, т.к. есть дополнительные поля.
Файл views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
from django.contrib.auth.decorators import login_required from django.contrib.auth import authenticate, login, logout ... class UserForm( forms.ModelForm ): username = forms.CharField( max_length = 30 ) firstname = forms.CharField( max_length = 30, required = False ) lastname = forms.CharField( max_length = 30, required = False ) email = forms.CharField( max_length = 30 ) pass1 = forms.CharField( widget = forms.PasswordInput, label = "Пароль", min_length = 6, max_length = 30 ) pass2 = forms.CharField( widget = forms.PasswordInput, label = "Пароль ещё раз" ) def clean_pass2( self ): if ( self.cleaned_data["pass2"] != self.cleaned_data.get( "pass1", "") ): raise forms.ValidationError( "Пароли не совпадают" ) return self.cleaned_data["pass2"] class UserProfileForm( forms.ModelForm ): weight = forms.IntegerField( min_value = 10, max_value = 200 ) def signup( request ): """Регистрация""" user = User() userProfile = UserProfile() if request.method == "POST": userForm = UserForm( request.POST, instance = user ) userProfileForm = UserProfileForm( request.POST, instance = userProfile ) if userForm.is_valid() and userProfileForm.is_valid(): userData = userForm.cleaned_data user.username = userData['username'] user.first_name = userData['firstname'] user.last_name = userData['lastname'] user.email = userData['email'] user.set_password( userData['pass1'] ) user.save() userProfile = user.get_profile() userProfileData = userProfileForm.cleaned_data userProfile.weight = userProfileData['weight'] userProfile.save() user = authenticate( username = userData['username'], password = userData['pass1'] ) login(request, user) return HttpResponseRedirect( "/accounts/profile/" ) else: userForm = UserForm( instance = user ) userProfileForm = UserProfileForm( instance = userProfile ) return render_to_response( "accounts/signup.html", { "user_": user, "userProfile": userProfile, "userForm": userForm, "userProfileForm": userProfileForm }, context_instance = RequestContext( request ) ) @login_required def my_profile( request ): """Профиль текущего пользователя""" user = request.user return render_to_response( "accounts/card.html", { "user": user }, context_instance = RequestContext( request ) ) |
Similar Posts
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.