Как правильно отображать поля формы с помощью 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)

Это облегчает работу, когда вы начнете передавать больше переменных в контекст позже, иначе это усложнит ваше представление.

Вернуться на верх