#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, которое предлагает вам множество функций для создания и регистрации пользователей. Настройка очень проста, вы можете найти очень хороший документ здесь