2015-09-22 3 views
3

Этот вопрос задал много вопросов о SO, но ни одно из этих решений не сработало для меня. Мне интересно, чего мне не хватает. Я использую пример от Effective Django. Это позволило мне создать форму «register», которая будет перенаправлена ​​на «/» после успеха. Корневая страница перенаправляется на форму входа, если пользователь уже не зарегистрирован. Все, что я хочу, это форма регистрации, чтобы автоматически регистрировать пользователя при регистрации.Автоматический вход в Django 1.8

Я создал в views.pyRegisterView() а, который просто пытается аутентифицировать/пользователей для входа в form_valid():

class RegisterView(CreateView): 
    template_name = 'register.html' 
    form_class = forms.UserCreateForm 
    success_url='/' 

    def form_valid(self, form): 
    user = form.save() 
    user = authenticate(username=self.request.POST['username'], password=self.request.POST['password1']) 
    login(self.request, user) 
    return super(RegisterView, self).form_valid(form) 

Этот вид работ. Я попытался создать исключение, если user.is_authenticated() == False, и никаких исключений не возникает. Однако к моменту переадресации браузера на success_url, по-видимому, информация для входа теряется, и декодер @login_required делает вход пользователя перед просмотром /.

Я также пытался сделать user.backend = 'django.contrib.auth.backends.ModelBackend' до звонка до login(...); и я также установил AUTHENTICATION_BACKENDS.

Что-то значительно изменилось в 1.8, чтобы предотвратить это? Все, что я видел в Интернете, это решение, но для меня это просто не работает.

Примечание: после регистрации пользователь может войти вручную.

+1

Я заметил, что вы используете CreateView, вместо этого вы пытались использовать FormView? – Joseph

+0

@Joseph CreateView является подклассом FormView. –

+0

@ Joseph на самом деле я пробовал использовать FormView, и теперь он работает точно так, как я ожидаю. Почему это работает, если (как упоминал Род) CreateView является подклассом FormView? – sagargp

ответ

1

У меня была эта проблема, когда я делал свой собственный сайт в Django 1.8. Оказывается, что CreateView наследует FormMixin, а не FormView. Попробуйте наследовать от FormView, и это должно получить желаемые результаты без ущерба для каких-либо других функций.

https://docs.djangoproject.com/en/1.8/ref/class-based-views/generic-editing/#formview

+0

Я не уверен, почему (пока), но это решение сработало. Мне любопытно, что именно несет ответственность за это поведение. – sagargp

1

В основном я предпочитаю классические представления функциям, основанным на времени, хотя оба они потребуются как-то. Чтобы ответить на ваш вопрос, я также изучать его, у меня была такая же проблема, и вот как это должно быть из документации Django: - В вашем settings.py, вы должны иметь что-то вроде этого:

AUTHENTICATION_BACKENDS = (

    'django.contrib.auth.backends.ModelBackend', 
) 
LOGIN_URL = 'django.contrib.auth.views.login' 
LOGIN_REDIRECT_URL = 'view where to redirect user' 
SITE_ID = 1 

и в моем шаблоне регистрации, моя кнопка отправки будет выглядеть примерно так:

<input class="btn btn-lg btn-primary btn-block" type="submit" value="Login"> 
<input type="hidden" name="next" value="{% if next %}{{ next }}{% else %}{% url 'template or view where to redirect to' %}{% endif %}">. 

Так второй тег перенаправляют пользователя на то, что страница, которую вы хотите, чтобы он пошел после регистрации или входа в систему. Я использовал для случая, когда вам нужно было прокомментировать статью, в которой вам необходимо сначала войти в систему, поэтому после входа в систему будет логично перенаправить пользователя на предыдущую страницу. Так я и достиг этого. Надеюсь, он поможет

+0

Я думаю, что вы, возможно, неправильно поняли вопрос OP - они хотят, чтобы пользователь автоматически регистрировался (т. Е. Cookie cookie) после регистрации. В настоящее время пользователь перенаправляется на страницу входа в систему после регистрации. Это плохой пользовательский опыт, потому что они вводят свою регистрационную информацию (адрес электронной почты и пароль), а затем сразу же вводят ее снова для входа. – Joseph

+0

Хорошо, ваше объяснение, но то, что я достиг, было таким же, если я не ошибаюсь, я предоставил @login_required, чтобы человек мог прокомментировать статью. Вы должны войти в систему, чтобы прокомментировать, если вам не нужно регистрироваться, и нажав на отправку в шаблонах регистрации, он перенаправляет вас к статье, которую вы собираетесь комментировать, когда вы вошли в систему. –

0

на основе кода, разделяемой выше, вы должны проверить, если user = authenticate(username=self.request.POST['username'], assword=self.request.POST['password1']) returns a value before invoking login_user (пользователь) `

def form_valid(self, form): 
    user = form.save() 
    user = authenticate(username=self.request.POST['username'], password=self.request.POST['password1']) 
    if user is not None:    
     login(self.request, user) 
     # this is the only time the user would be logged in. 
    return super(RegisterView, self).form_valid(form) 

чек (https://docs.djangoproject.com/en/1.8/topics/auth/default/#django.contrib.auth.login) для получения дополнительной информации. `

Смежные вопросы