使用simple-django-login-and-register注册应用后自定义表单不显示求助
问题排查及修复方案
已发现的问题点:
- 表单类语法错误:
form代码中fields定义的第一个字段name左侧缺少单引号,属于语法错误,会直接导致表单类加载失败。 - 路由与视图函数不匹配:你定义的视图函数名为
add_bio,但urls.py中配置的视图是views.add_information,二者名称不一致,请求无法正确对应到处理逻辑。 - 上下文变量名不匹配:视图
add_bio中给模板传递的上下文键是form,但模板中调用的是info_form.as_p,变量名对不上,模板找不到表单对象所以无法渲染。 - 命名冲突风险:模型类和表单类都命名为
UserBio,极易在导入或调用时出现命名覆盖问题,建议给表单类改名区分,比如UserBioForm。 - 跳转路径不规范:表单提交成功后的重定向用了硬编码的相对路径,建议用Django内置的
reverse函数通过路由名反解析路径,避免路径修改后跳转失效。 - 模板缺失功能标签:原模板的表单区块没有提交按钮,且出现了多余的
</div>、</body>标签,既无法完成提交操作,也可能和继承的父模板结构冲突导致渲染异常。
修复后的代码参考:
1. form代码
# 修改类名避免和模型重名 class UserBioForm(forms.ModelForm): class Meta: model = UserBio # 补全name左侧缺失的单引号 fields = ('name', 'age', 'phone', 'height', 'weight')
2. views代码
from django.shortcuts import reverse def add_bio(request): submitted = False if request.method == "POST": info_form = UserBioForm(request.POST) if info_form.is_valid(): info_form.save() # 用reverse反解析路由地址,避免硬编码路径出错 return HttpResponseRedirect(f"{reverse('add_information')}?submitted=True") else: info_form = UserBioForm() if 'submitted' in request.GET: submitted = True # 上下文变量名和模板调用名保持一致 return render(request, 'accounts/profile/add_information.html', {'info_form': info_form, 'submitted':submitted})
3. urls代码
urlpatterns = [ # 路由绑定正确的视图函数名 path('add/information', views.add_bio, name='add_information'), ]
4. html模板代码
{% extends 'layouts/default/base.html' %} {% block title %} Add info {% endblock %} {% load i18n %} {% block content %} <h4>{% trans 'Add Info' %}</h4> {% if submitted %} Submitted correctly {% else %} <form method="post"> {% csrf_token %} {{ info_form.as_p }} <!-- 补充缺失的提交按钮 --> <button type="submit">提交</button> </form> <br/> {% endif %} {% endblock %}
内容的提问来源于stack exchange,提问作者Kome Gognome
相关产品推荐
相关产品推荐

