Как правильно отображать поля формы с помощью django?
В настоящее время я работаю над страницей входа в систему для django webapp. Я пытаюсь включить форму входа в файл index.html. Однако, поля формы не отображаются. Урлы правильные, но я не уверен, где я ошибаюсь. Вот мои views.py, forms.py и фрагмент index.html. (Я не хочу создавать новую страницу для входа, я хочу сохранить ее на индексной странице)
# Home view
def index(request):
form = LoginForm()
if form.is_valid():
user = authenticate(
username=form.cleaned_data['username'],
password=form.cleaned_data['password'],
)
if user is not None:
login(request, user)
messages.success(request, f' welcome {user} !!')
return redirect('loggedIn')
else:
messages.info(request, f'Password or Username is wrong. Please try again.')
return render(request, "index_logged_out.html")
class LoginForm(forms.Form):
username = forms.CharField(max_length=63)
password = forms.CharField(max_length=63, widget=forms.PasswordInput)
<!-- Login -->
<section class="page-section" id="login">
<div class="container">
<div class="text-center">
<h2 class="section-heading text-uppercase">Login</h2>
</div>
<form>
{% csrf_token %}
{{form}}
<center><button class="btn btn-primary btn-block fa-lg gradient-custom-2 mb-3" type="submit" style="width: 300px;">Login</button></center>
</form>
<div class="text-center pt-1 mb-5 pb-1">
<center><a class="text-muted" href="#!">Forgot password?</a></center>
</div>
<div class="d-flex align-items-center justify-content-center pb-4">
<p class="mb-0 me-2">Don't have an account?</p>
<button type="button" class="btn btn-outline-primary"><a href="{% url 'register' %}">Create New</a></button>
</div>
</form>
</div>
</section>
В представлении index() вы создаете объект LoginForm, но не передаете его в шаблон при рендеринге. Это означает, что поля формы не будут отображены в шаблоне.
Чтобы исправить это, вы можете передать объект формы в шаблон при его рендеринге, например, так:
def index(request):
form = LoginForm()
if form.is_valid():
# ...
return render(request, "index_logged_out.html", {"form": form})
Добавлю к ответу A.S., вы должны инициализировать контекстную переменную в начале представления.
def index(request):
context = {}
form = LoginForm()
context['form'] = form
if form.is_valid():
# ...
return render(request, "index_logged_out.html", context)
Это облегчает работу, когда вы начнете передавать больше переменных в контекст позже, иначе это усложнит ваше представление.