Регистрация, затем войдите в систему пользователя с помощью Django

#django #views #httprequest

#django #число просмотров #httprequest

Вопрос:

У меня есть простая форма регистрации (в signup.html )

 <form action="adduser" method="post">
{% csrf_token %}
  Email Address: <input type="email" name="email" required autocomplete="on" placeholder="fr@star.com"/><br/>
  Username: <input type="text" name="username" maxlength=25 required placeholder="JoyfulSophia"/><br/>
  Password: <input type="password" name="password" maxlength=30 required placeholder="**********" /><br/>
  <br/>
  <input type="submit" value="Send" /> <input type="reset">
</form>
 

Это перенаправляет на представление addUser:

 def adduser(request):
    u = User.objects.create_user(request.POST['username'], request.POST['email'], password=request.POST['password'])
    u.save()
    a = Accounts(user=u)
    p = Passwords(user=u)
    a.save()
    p.save()
    return HttpResponseRedirect(reverse('OmniCloud_App.views.profile', args=(u.id,)))
 

Вот профиль:

 @login_required    
def profile(request, User_id):
    u = get_object_or_404(User, pk=User_id)
    a = get_object_or_404(Accounts, pk=User_id)
    return render_to_response('profile.html', context_instance=RequestContext(request))
 

Таким образом, они не будут авторизованы, но это нормально, потому что мы можем отправить вас в /accounts/login?next=/7/ поскольку они являются пользователем 7 (проблемы впереди!)

 def login(request):
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    if user is not None and user.is_active:
        auth.login(request, user)
        return HttpResponseRedirect("/account/profile/")
    else:
        return HttpResponseRedirect("/account/invalid/")
 

Запрос не содержит ничего, что называется username, но тот, который был отправлен в форму addUser, содержит, так как я могу отправить этого братана для входа в систему? Я мог бы заставить его проанализировать URL-адрес (который содержит next=USER_ID ), но это не сработало бы для кого-то, кто просто вводит base_url / login , и user_id не будет частью URL навсегда. Так что же делать брату?

Ответ №1:

Данные Post существуют только для одного запроса. Если вы хотите использовать его позже, вам следует сохранить его где-нибудь в другом месте.

Вы можете войти в систему пользователя сразу после регистрации, в adduser представлении, он просто ввел свое имя пользователя и пароль, ему не нужно делать это снова.

И представление входа немного отключено. Это всего лишь часть представления «POST». Вам нужно проверить и посмотреть, является ли это запросом GET и является ли он шаблоном возврата с формой, содержащей username password поля и и с целевым URL, который указывает на то же представление. Что-то вроде этого:

 def login(request):
    if request.method == 'GET':
        return render_to_response('login.html', 
                                  { 'form': LoginForm() },
                                  context_instance=RequestContext(request))
    elif request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = auth.authenticate(username=username, password=password)
            if user is not None and user.is_active:
                auth.login(request, user)
                return HttpResponseRedirect("/account/profile")
            else:
                return HttpResponseRedirect("/account/invalid/")
 

Где login.html что-то вроде этого:

 {% extends "base_site.html" %}

{% block content %}
    <form method="post" target="{% url login_view %}">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Login" />
    </form>
{% endblock content %}
 

Кроме того, вы можете вернуть пользователя в ту же форму входа, если имя пользователя и пароль не совпадают, и добавить какое-либо сообщение!

Это просто из головы, не пробовал, но это должно сработать!

Комментарии:

1. У меня уже есть login.html , так нужно ли мне включать {form, LoginForm() … и т.д.?

2. Нет необходимости иметь LoginForm, вы можете самостоятельно ввести html, а затем извлечь данные из запроса. СООБЩЕНИЕ, но я бы посоветовал его использовать. Я бы также использовал его для регистрации, это может упростить задачу. Кроме того, если вы создадите его, вам придется его импортировать. Согласно представлению, которое я написал в форме ответа, будет доступно в шаблоне как form , но вы можете его изменить.

Ответ №2:

Для Django существует расширяемое приложение для регистрации пользователей под названием django-registration, которое предлагает вам множество функций для создания и регистрации пользователей. Настройка очень проста, вы можете найти очень хороший документ здесь