Django signup页面出现BootstrapError:form参数无效的解决求助
解决Django Bootstrap4中Signup页面的BootstrapError问题
我在使用Django搭配Bootstrap4开发时,signup页面出现BootstrapError,提示“Parameter 'form' should contain a valid Django Form”,但login页面使用相同的{% bootstrap_form form %}标签却能正常运行。尝试添加layout='inline'参数但无效,相关代码如下,请求解决该错误的方法。
相关代码
views.py
from django.shortcuts import redirect, render from .forms import SignupForm from django.contrib.auth import authenticate, login # Create your views here. def sign_up(request): if request.method == 'POST': form = SignupForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data('username') password = form.cleaned_data('password1') user = authenticate(username=username, password=password) login(request, user) return redirect('/accounts/profile') else: form = SignupForm() context = {form: 'form'} return render(request, 'registration/signup.html', context)
forms.py
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class SignupForm(UserCreationForm): class Meta: model = User fields = ('username', 'email', 'password1', 'password2')
signup.html
{% extends "base_generic.html" %} {% load bootstrap4 %} {% block content %} <form method="post" > {% csrf_token %} {% bootstrap_form form %} <input type="submit" value="signup" class="boxed-btn3 w-100"> </form> {% endblock %}
login.html
{% extends "base_generic.html" %} {% load bootstrap4 %} {% block content %} {% if form.errors %} <p>Your username and password didn't match. Please try again.</p> {% endif %} {% if next %} {% if user.is_authenticated %} <p>Your account doesn't have access to this page. To proceed, please login with an account that has access.</p> {% else %} <p>Please login to see this page.</p> {% endif %} {% endif %} <form method="post" action="{% url 'login' %}"> {% csrf_token %} {% bootstrap_form form %} <input type="submit" value="login" class="boxed-btn3 w-100"> <input type="hidden" name="next" value="{{ next }}"> </form> {# Assumes you setup the password_reset view in your URLconf #} <p><a href="{% url 'password_reset' %}">Lost password?</a></p> {% endblock %}
解决方法
问题出在两个地方,修改后即可解决错误:
上下文字典赋值错误
原代码中context = {form: 'form'}把Form对象作为字典键,字符串'form'作为值,模板无法识别到正确的表单对象。正确写法是将键设为模板中引用的变量名'form',值为Form实例:context = {'form': form}cleaned_data取值语法错误
form.cleaned_data是字典类型,需用方括号[]访问键值,原代码用圆括号调用会报错,修改为:username = form.cleaned_data['username'] password = form.cleaned_data['password1']
修改后的完整views.py代码
from django.shortcuts import redirect, render from .forms import SignupForm from django.contrib.auth import authenticate, login # Create your views here. def sign_up(request): if request.method == 'POST': form = SignupForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data['username'] password = form.cleaned_data['password1'] user = authenticate(username=username, password=password) login(request, user) return redirect('/accounts/profile') else: form = SignupForm() context = {'form': form} return render(request, 'registration/signup.html', context)
内容的提问来源于stack exchange,提问作者Omnia Osman
相关产品推荐
相关产品推荐

