【问题标题】:Django won't render form in multiple templates?Django 不会在多个模板中呈现表单?
【发布时间】:2019-11-14 09:50:31
【问题描述】:

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']

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

【问题讨论】:

  • 我不确定您为什么复制了模板。你想达到什么目的?在任何情况下,登录视图都不会将注册表单发送到模板。
  • 感谢您的回复。我想我对如何将UserRegistrationForm() 发送到login.html 模板感到困惑。我已将“register.html”模板复制到login.html 模板中作为起点(因为它适用于register.html 模板)。我想我需要为login.html 模板创建一个单独的表单,将def login() 函数添加到views.py,然后将该表单传递给login.html?我很困惑,因为我一直在关注 Corey Schafer 的视频 here 而他没有做任何事情?
  • 但它在 register.html 模板中工作,因为它是由注册视图呈现的。 login.html 模板由 LoginView 呈现,您无法控制它,因为您从 django.contrib.auth 导入它。我不确定你为什么要这样做,login.html 是用来显示登录表单的。
  • 您的回复在我编辑上述回复之前就已收到。请看上面。谢谢。
  • 不,如果您只想显示登录表单,则无需执行任何操作;您只需在模板中使用 form 而不是 registration_form,因为这是 LoginView 发送的内容。

标签: python django django-crispy-forms


【解决方案1】:

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

基本上,上面的内容有点混乱。 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 %}

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2016-12-06
    • 2014-11-26
    • 2015-11-27
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多