我一直在线关注文档/视频,但是似乎无法渲染我的表单,如果有人可以向我解释我做错了什么,我会很高兴:我的目标是获取要呈现的表单
这是我的代码:
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'
在Chrome和Firefox上尝试过
显然您的空间很小。
更改此。
{{ form |crispy }}
为此。
{{ form|crispy }}
我设法使表格得以呈现。我不确定具体解决方案是什么,但是我改变的是;我已经将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 %}
从此更正表单元类中的行:
fields = ['username', 'email', 'password1', 'password2']
为此:
fields = ('username', 'email', 'password1', 'password2')