简体   繁体   English

Django不会在多个模板中呈现表单吗?

[英]Django won't render form in multiple templates?

New to Django. Django的新手。 Crispy form renders beautifully on register page. 酥脆的表格在注册页面上呈现精美。 Exact copy and paste doesn't render the form on login page? 精确复制和粘贴不会在登录页面上呈现该表单吗? All help is greatly appreciated. 非常感谢所有帮助。

I've also tried removing Crispy from the equation with no luck. 我也尝试过从方程式中删除Crispy,但是没有运气。

main_project/urls.py 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')
]

users/forms.py users / 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']

users/views.py users / 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 AND users/login.html users / register.html AND 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 %}

@Daniel Roseman solved this perfectly, see the comments. @Daniel Roseman完美解决了这个问题,请参阅评论。

Basically, the above is sort of a mess. 基本上,以上情况有点混乱。 Django class ListView() already returns a form to the template of your choosing (that's sort of the point). Django类ListView()已经向您选择的模板返回了一个表单(这很重要)。 Using form instead of register_form for the form tag makes everything work perfect. 对form标签使用form而不是register_form可以使一切正常。 See corrected code below. 请参阅下面的更正代码。

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 %}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM