#python #django #checkbox
#питон #джанго #флажок
Вопрос:
Я новичок в django и не нашел вопроса, соответствующего моему начальному уровню. И я просто не могу понять, как работать с сеансами. Я хочу установить флажок при входе в систему, чтобы запомнить меня. После того, как я зарегистрировался в настройках SESSION_EXPIRE_AT_BROWSER_CLOSE = True, вам нужно ввести свое имя пользователя и пароль после закрытия браузера. Как мне изменить этот параметр, используя флажок «запомнить меня»? Спасибо
views.py
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
return redirect('/')
else:
messages.info(request, 'invalid credentials')
return redirect('login')
else:
return render(request, 'prof/login.html')
login.html
<body>
<div class="text-center mt-5">
<form style="max-width: 480px; margin: auto" method="post">
{% csrf_token %}
<img
src="https://logodix.com/logo/1713894.jpg"
alt=""
width="120"
height="90"
class="d-inline-block mt-4 mb-4"
/>
<p class="hint-text mb-3">Please sign in</p>
<label class="sr-only" for="username"></label>
<input
type="login"
name="username"
class="form-control"
placeholder="username"
required
autofocus
/>
<label for="password" class="sr-only"></label>
<input
type="password"
name="password"
class="form-control mt-2"
placeholder="password"
/>
<div class="checkbox">
<label for="checkbox">
<input type="checkbox" name="checkbox" value="remember-me" /> remember
me
</label>
</div>
<div class="d-grid gap-2 mt-4">
<input type="Submit" class="btn btn-primary" value="sign in" />
</div>
</form>
<div class="messages">
{% for message in messages %}
<h3>{{message}}</h3>
{% endfor %}
</div>
Ответ №1:
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
try:
remember = request.POST['remember_me']
if remember:
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = False
except:
is_private = False
settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True
if user is not None:
auth.login(request, user)
return redirect('/')
else:
messages.info(request, 'invalid credentials')
return redirect('login')
else:
return render(request, 'prof/login.html')
Ответ №2:
вам нужно установить request.session.set_expiry(значение) при входе пользователя в систему и щелчке флажка.
значение в этой функции заполняется с использованием следующих типов данных и значений: https://docs.djangoproject.com/en/3.1/topics/http/sessions/#django.contrib.sessions.backends.base .База сеансов.set_expiry
для вас это будет означать следующее:
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
if request.cleaned_data['remember_me'] == True:
request.session.set_expiry(value)
# ^^^^^^
# insert something here
return redirect('/')
else:
messages.info(request, 'invalid credentials')
return redirect('login')
else:
return render(request, 'prof/login.html')
Комментарии:
1. Большое спасибо за ваш ответ, но когда я не включаю <checkbox> при входе в систему, появляется ошибка:MultiValueDictKeyError . И я нашел это решение (второй ответ). Кажется, все работает, Что вы думаете о моем решении?
2. Выглядит хорошо. Хотя мне не очень нравится использование операторов try. Я внес небольшое изменение, которое может это исправить. Я бы также всегда предлагал использовать класс «forms». Это упрощает получение данных из формы.
3. Я вас понял, но < вставить что-то здесь> что мне нужно вставить здесь? что угодно?
4. Вы можете найти, что в документации у вас есть несколько доступных опций: docs.djangoproject.com/en/3.1/topics/http/sessions /…