Django中如何将form.ModelForm数据存入数据库并在模板展示新帖子
问题修复方案
1. 视图文件(views.py)错误修正
- 未区分GET/POST请求,首次加载页面时直接传入空的
request.POST初始化表单,逻辑不规范 - 跳转路由名写错,
urls.py中定义的详情页路由名是post-detail,不是post_detail - 创建表单的视图错误渲染了详情页模板,应该使用专门的表单提交模板
修正后代码:
from django.shortcuts import render, redirect from django.utils import timezone from .forms import PostForm def create_post(request): # 仅POST请求时用用户提交数据初始化表单 if request.method == 'POST': form = PostForm(request.POST) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.date_posted = timezone.now() post.save() # 路由名和urls.py定义保持一致 return redirect('post-detail', pk=post.pk) # GET请求/表单校验失败时返回空表单/带错误提示的表单 else: form = PostForm() # 渲染创建帖子的专用模板 return render(request, 'post_create.html', {'form': form})
2. 表单文件(forms.py)错误修正
author和date_posted字段已经在视图中手动赋值,不需要暴露给用户填写,从表单字段列表中移除即可
修正后代码:
from django import forms from .models import Post class PostForm(forms.ModelForm): class Meta: model = Post # 仅保留需要用户手动填写的字段 fields = ['title', 'description']
3. 新增创建帖子模板(post_create.html)
浏览器无内容是因为之前错误渲染了详情页模板,没有表单渲染逻辑,新增该模板写入如下代码:
<!DOCTYPE html> <html> <head> <title>新建帖子</title> </head> <body> <h1>新建帖子</h1> <form method="POST"> {% csrf_token %} {{ form.as_p }} <button type="submit">发布帖子</button> </form> </body> </html>
4. 详情页模板(post_detail.html)渲染逻辑
如果提交成功后详情页看不到帖子内容,确保模板中有对应字段的渲染逻辑,示例代码:
<!DOCTYPE html> <html> <head> <title>{{ post.title }}</title> </head> <body> <h1>{{ post.title }}</h1> <p>发布时间:{{ post.date_posted }}</p> <p>作者:{{ post.author.username }}</p> <p>内容:{{ post.description }}</p> </body> </html>
5. 路由文件(urls.py)优化
移除无用的导入即可,不影响核心运行:
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('create/', views.create_post, name='create-post'), path('detail/<int:pk>/', views.PostDetailView.as_view(), name='post-detail'), ]
内容的提问来源于stack exchange,提问作者Mehroz Malik
相关产品推荐
相关产品推荐

