Django Crispy_Form не может отображаться в HTML - PullRequest
2 голосов
/ 03 ноября 2019

Я следил за документами / видео в Интернете и, похоже, не могу получить свою форму для рендеринга, я был бы рад, если бы кто-нибудь объяснил мне, что я делаю неправильно: моя цель - получить форму для рендеринга

Вот мой код:

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>

URL основного приложения. py

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

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

страниц \ urls.py

из пути импорта django.urls

из. импорт представлений

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

страницы \ 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'

Результат я получаю на сайте

Пробовал на Chrome и Firefox

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Видимо, у вас есть небольшое пространство.

Измените это.

{{ form |crispy }}

Для этого.

{{ form|crispy }}
0 голосов
/ 09 ноября 2019

Мне удалось получить форму для рендеринга. Я не совсем уверен, что именно было решением, но я изменил;Я поместил файл register.urls в основной файл urls как отдельное приложение со своими собственными URL-адресами и правильно направил его в файл 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 голосов
/ 04 ноября 2019

Исправьте строку в вашем мета-классе формы следующим образом:

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

К этому:

fields = ('username', 'email', 'password1', 'password2')
...