You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 05:48:03