如何在Django中实现用户自主发帖功能,解决点击创建帖子返回空白页问题
问题修复方案
1. 核心问题:URL路由匹配顺序错误
Django的路由规则是从上到下优先匹配,你把动态路径<category>/放在了固定路径post_form/前面,当你点击「Create a Post」访问post_form/时,Django会把post_form当做分类名参数传入blog_category视图,查询名称包含post_form的分类对应的帖子,没有匹配结果就会渲染出空白的分类页。
修复方案:调整urls.py中路由的顺序,把固定路径放在动态路径前面:
urlpatterns = [ path("", views.blog_index, name="blog_index"), path("<int:pk>/", views.blog_detail, name="blog_detail"), path("post_form/", views.blog_post, name="blog_post"), # 移到<category>/前面 path("<category>/", views.blog_category, name="blog_category"), ]
2. 发帖表单提交逻辑错误
调整路由后进入发帖页,现有表单也无法正常提交,存在两个低级错误:
- 表单的
action属性写死为/blog/,提交后不会走blog_post视图的表单处理逻辑 - 提交按钮用了
<a>标签,点击后直接跳转到首页,根本不会触发表单提交
修复方案:修改blog_post.html的表单部分:
<form action="" method="post"> <!-- action留空表示提交到当前url --> {% csrf_token %} <div class="form-group"> {{ post_form.title }} </div> <div class="form-group"> {{ post_form.author }} </div> <div class="form-group"> {{ post_form.body }} </div> <!-- 换成原生button提交表单 --> <button type="submit" class="btn btn-primary">Submit</button> </form>
3. 可选优化:提交成功后重定向
当前blog_post视图表单提交成功后还是渲染当前发帖页,用户刷新会重复提交表单,建议添加重定向逻辑:
先导入redirect模块:
from django.shortcuts import render, redirect
然后修改blog_post视图:
def blog_post(request): post_form = PostForm() if request.method == 'POST': post_form = PostForm(request.POST) if post_form.is_valid(): post = Post( title=post_form.cleaned_data["title"], author=post_form.cleaned_data["author"], body=post_form.cleaned_data["body"], ) post.save() return redirect('blog_index') # 提交成功直接跳转到首页 args= {'post_form': post_form} return render(request, "blog_post.html", args)
额外注意
Post模型的categories字段是多对多字段,默认必填,你现在创建Post的时候没有给这个字段赋值,提交表单的时候会报错,建议要么给categories字段加blank=True允许为空,要么在发帖表单里添加分类选择项。
内容的提问来源于stack exchange,提问作者AllyZ
相关产品推荐
相关产品推荐

