Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 21, 2013 09:58:29

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Login в Django 1.5

Здравствуйте!
Использую переопределенную модель User с авторизацией по e-mail:

class MyUser(AbstractBaseUser):
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
        db_index=True,
    )
    last_name=models.CharField(max_length=30)
    first_name=models.CharField(max_length=30)
    second_name=models.CharField(max_length=30, blank=True)
    post=models.CharField(max_length=30, blank=True)
   .....
    objects = MyUserManager()
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['last_name','first_name','second_name','post', ....]
    
    def get_full_name(self):
       return self.email
    def get_short_name(self):
       return self.email
    def __unicode__(self):
        return self.email
    def has_perm(self, perm, obj=None):
       return True
    def has_module_perms(self, app_label):
       return True
    @property
    def is_staff(self):
        return self.is_admin
view:
def login(request):
    username = request.POST['email']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None and user.is_active:
        login(request, user)
        return HttpResponseRedirect("/home.html")# Redirect to a success page.
    else:
        return HttpResponseRedirect("/account/invalid/")# Return a 'disabled account' error message
url:
(r'^login/$',  login),
Возникает ошибка MultiValueDictKeyError: “Key ‘email’ not found in <QueryDict: {}>”
Что неправильно делаю?
Спасибо!

Офлайн

#2 Фев. 21, 2013 12:04:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Login в Django 1.5

Подозреваю, что ошибка в том, что в POST нету ключа email. Посмотрите в HTML-код формы авторизации, наверняка у поля логина name не email, а например username.



Офлайн

#3 Фев. 21, 2013 15:53:33

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Login в Django 1.5

Перепутал я всё на свете с этими разными версиями и с разными книжками, но вроде некое просветление близится.

В общем сейчас такая ситуация: попробовал способ с использованием from django.contrib.auth.views import login
во view ничего не писал, в url:

(r'^login/$', login_view, {'template_name': 'enter.html'}),
Работает только для суперпользователя, который сидит в старой модели юзеров.

Для MyUser хочу попробовать так:

view:
def login_view(request):
	username = request.POST['email']
	password = request.POST['password']
	user = authenticate(username=username, password=password)
	if user is not None and user.is_active:
		login(request, user)
		return HttpResponseRedirect("/n1.html")# Redirect to a success page.
	else:
		return HttpResponseRedirect("/account/invalid/")# Return a 'disabled account' error message
шаблон:
 {% if form.errors %}
    <p>Неверное имя или пароль</p>
    {% endif %}
    <form action="" method="post">
        {% csrf_token %}
        <label for="email">Имя пользователя:</label>
        <input type="text" name="email" value="" id="email"/>
        <label for="password">Пароль:</label>
        <input type="password" name="password" value="" id="username">
        <input type="submit" value="login" />
        <input type="hidden" name="next" value="{{next|escape}}" />
        
    </form>
В urls
(r'^login/$', login_view, {'template_name': 'enter.html'}),
но тут он уже почему-то не хочет шаблон принимать:
login_view() got an unexpected keyword argument ‘template_name’

Офлайн

#4 Фев. 22, 2013 11:28:22

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Login в Django 1.5

С ошибками вроде разобрался, сделал так:
модель:

class MyUser(AbstractBaseUser):
        email = models.EmailField(
            verbose_name='email address',
            max_length=255,
            unique=True,
            db_index=True,
        )
        last_name=models.CharField(max_length=30)
        first_name=models.CharField(max_length=30)
        second_name=models.CharField(max_length=30, blank=True)
        post=models.CharField(max_length=30, blank=True)
    
        objects = MyUserManager()
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = ['last_name','first_name','second_name','post',]
        
        def get_full_name(self):
           return self.email
    
        def get_short_name(self):
           return self.email
    
        def __unicode__(self):
            return self.email
    
        def has_perm(self, perm, obj=None):
           return True
    
        def has_module_perms(self, app_label):
           return True
    
        @property
        def is_staff(self):
            return self.is_admin
    class LoginForm(forms.Form):
    username = forms.CharField(max_length=100)
    password =forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100)

view:
    def login_view(request):
	if request.method == 'POST':
		username = request.POST['email']
		password = request.POST['password']
		user = authenticate(username=username, password=password)
		if user is not None and user.is_active:
			login(request, user)
			return HttpResponseRedirect("/home.html")# Redirect to a success page.
		return HttpResponseRedirect("/account/invalid/")# Return a 'disabled account' error message
	form=LoginForm()
	return render(request, 'enter.html', {'login_form': LoginForm})
template:
    {% if form.errors %}
    <p>Something is wrong</p>
    {% endif %}
    
    <form action="" method="post">
        {% csrf_token %}
        <label for="email">Login:</label>
        <input type="text" name="email" value="" id="email"/>
        <label for="password">Password:</label>
        <input type="password" name="password" value="" id="username">
    
        <input type="submit" value="login" />
        <input type="hidden" name="next" value="{{next|escape}}" />
        
    </form>
urls:
(r'^login/$', login_view),

Теперь проблема в том, что этот механизм работает для юзеров, которых я добавляю в дефолтную модель Users. Те, кто из модели MyUser отправляются на страницу /account/invalid/
Как привязать механизм аутентификации к модели MyUser?
Спасибо!




Офлайн

#5 Фев. 22, 2013 12:56:35

dnstuff
Зарегистрирован: 2012-11-05
Сообщения: 113
Репутация: +  1  -
Профиль   Отправить e-mail  

Login в Django 1.5

Разобрался. Надо в settings.py добавить AUTH_USER_MODEL = ‘appl.MyUser’. Но при этом под старым админом в админку уже не попасть. Поэтому сначала надо заготовить админа в MyUser, потом уже AUTH_USER_MODEL = ‘appl.MyUser’.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version