Django Crispy_Form无法以HTML呈现

问题描述 投票:2回答:3

我一直在线关注文档/视频,但是似乎无法渲染我的表单,如果有人可以向我解释我做错了什么,我会很高兴:我的目标是获取要呈现的表单

这是我的代码:

views.py

我根据请求类型处理了两种情况,没有将else块留空。定义了表单,别忘了重定向

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


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('')
    else:
        form = UserRegisterForm()
    return render(request, 'register.html', {'form': form})

forms.py

从现有的Django表单中定义一个表单,并包含所有必要的字段

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


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

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

register.html

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <form method="POST">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">Join Today</legend>
            {{ form |crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Sign Up</button>
        </div>
    </form>
    <div class="border-top pt-3">
        <small class="text-muted">
            Already Have An Account? <a class="ml-2" href="#">Sign In</a>
        </small>
    </div>
</div>
{% endblock content %}

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <title>Q&A Learning Center {% block title %}{% endblock %}</title>
</head>
<body>
<div></div>
<header>
    <!-- NavBar -->
    {% include 'partials/_navbar.html' %}
    <div class="container">
        <div class="row">
            <div class="col-md-6 m-auto">
                {% block content %}{% endblock %}
            </div>
        </div>
    </div>
</header>

</body>
</html>

主应用程序urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('pages.urls')),
    path('admin/', admin.site.urls),
]

pages \ urls.py

从django.urls导入路径

来自。导入视图

urlpatterns = [
    path('', views.index, name='index'),
    path('about/', views.about, name='about'),
    path('register/', views.register, name='register'),
]

pages \ views.py

def register(request):
    return render(request, 'users/register.html')

settings.py

INSTALLED_APPS = [
    'users.apps.UsersConfig',
    'crispy_forms',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_mysql',
]
CRISPY_TEMPLATE_PACK = 'bootstrap4'

The result I get on the site

在Chrome和Firefox上尝试过

python django forms django-crispy-forms
3个回答
1
投票

显然您的空间很小。

更改此。

{{ form |crispy }}

为此。

{{ form|crispy }}

0
投票

我设法使表格得以呈现。我不确定具体解决方案是什么,但是我改变的是;我已经将register.urls作为具有其自己的url的独立应用程序放置在主urls文件中,并正确地路由到register.html才起作用。还更改了base.html,我认为在显示网站内容的地方也出现了错误

这里是更新的代码:

myApp.urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include('pages.urls')),
    path('', include('users.urls')),
    path('admin/', admin.site.urls),
]

users.urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
]

users.views.py

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


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('index/')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {
        'form': form
    })

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <meta http-equiv="X-UA-Compatible" content="ie=edge"/>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
          integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <title>Q&A Learning Center</title>
</head>
<body>
<nav>
    {% include 'partials/_navbar.html' %}
</nav>
    <div class="container">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

users.templates.users.register.html

{% extends 'base.html' %}

{% load crispy_forms_tags %}

{% block content %}
<div class="row justify-content-center">
    <div class="col-8">
        <div class="card">
            <div class="card-body">
                <h2>Sign Up</h2>
                <form method="post">
                    {% csrf_token %}
                    {{ form|crispy }}
                    <button type="submit" class="btn btn-primary">Sign up</button>
                </form>
            </div>
        </div>
    </div>
</div>
{% endblock %}

0
投票

从此更正表单元类中的行:

fields = ['username', 'email', 'password1', 'password2']

为此:

fields = ('username', 'email', 'password1', 'password2')
© www.soinside.com 2019 - 2024. All rights reserved.