首页 > 解决方案 > Django 不会在多个模板中呈现表单?

问题描述

Django的新手。酥脆的表格在注册页面上呈现精美。精确复制和粘贴不会在登录页面上呈现表单?非常感谢所有帮助。

我也试过从等式中删除 Crispy,但没有运气。

main_project/urls.py

from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
from  users import views as user_views
from website import views as website_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('register/', user_views.register, name='register'), 
    path('home/', website_views.home, name='site-home'),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout')
]

用户/forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    email = forms.EmailField()
    address = forms.CharField(max_length=100)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

用户/views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm

# Create your views here.
def register(request):
    if request.method == 'POST':
        register_form = UserRegisterForm(request.POST)
        if register_form.is_valid():
            register_form.save()
            username = register_form.cleaned_data.get('username')
            email = register_form.cleaned_data.get('email')
            messages.success(request, f'Account created for {username}')
            return redirect('website-home')
    else:
        register_form = UserRegisterForm()
        return render(request, 'users/register.html', {'register_form':register_form})

users/register.html 和 users/login.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}

<!-- Extra Styling? -->
{% block extrahead %}
{% endblock extrahead %}

<!-- Include Navbar? -->
{% block navbar %}
{% include 'navbar.html' %}
{% endblock navbar %}

<!-- Main HTML Page Cotent -->
{% block content %}

<div class="container">
    <form>
        <fieldset>
            <div class="row justify-content-center">
                <div class="col-6">
                    {% csrf_token %}
                    <legend>
                        {{register_form|crispy}}
                    </legend>
                </div>
            </div>
        </fieldset>
        <div class='row justify-content-center'>
            <div class="col-6">
                <button type="submit" class="btn btn-success float-right">Register</button>
            </div>
        </div>
    </form>
</div>

{% endblock content %}

标签: pythondjangodjango-crispy-forms

解决方案


@Daniel Roseman 完美解决了这个问题,请参阅评论。

基本上,上面的内容有点混乱。Django 类ListView()已经向您选择的模板返回了一个表单(这就是重点)。使用form而不是register_form表单标签使一切工作完美。请参阅下面的更正代码。

users/login.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}

<!-- Extra Styling? -->
{% block extrahead %}
{% endblock extrahead %}

<!-- Include Navbar? -->
{% block navbar %}
{% include 'navbar.html' %}
{% endblock navbar %}

<!-- Main HTML Page Cotent -->
{% block content %}

<div class="container">
        <form>
            <fieldset>
                <div class="row justify-content-center">
                    <div class="col-6">
                        {% csrf_token %}
                        <legend>
                            {{form|crispy}}
                        </legend>
                    </div>
                </div>
            </fieldset>
            <div class='row justify-content-center'>
                <div class="col-6">
                    <button type="submit" class="btn btn-success float-right">Register</button>
                </div>
            </div>
        </form>
    </div>

{% endblock content %}

推荐阅读