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

Django表单无法将文章保存至数据库问题求助

问题分析与修复方案

1. 视图函数缩进错误(核心致命问题)

你的views.py中,new_article函数内的代码未正确缩进,导致POST请求处理逻辑完全不会执行,函数直接返回渲染页面的结果——这就是状态码200但数据无法保存的根本原因。

修正后的views.py:

@login_required(login_url="/accounts/login/")
def new_article(req):
    if req.method == 'POST':
        form = forms.CreateArticle(req.POST, req.FILES)
        if form.is_valid():
            # 保存文章到数据库
            instance = form.save(commit=False)
            instance.author = req.user
            instance.save()
            return redirect('articles:list')
    else:
        form = forms.CreateArticle()
    return render(req, 'articles/createArticle.html', {'form': form})

2. HTML表单结构错误

  • 提交按钮位于<form>标签外部,点击时无法触发表单提交
  • {% csrf_token %}标签在<form>外部,会导致CSRF验证失败(当前未报错属于偶然,后续必然出问题)

修正后的表单部分代码:

<div class="create-article">
    <h2>Write your own Article!!</h2>
    <form class="newArticleForm" action="/articles/create/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Create">
    </form>
</div>

3. Slug字段未自动填充(潜在验证失败问题)

Articles模型中的slug字段为必填项,但表单提交时若未手动输入,form.is_valid()会返回False且无直观报错,导致数据无法保存。推荐重写模型save方法自动生成slug:

修正后的models.py:

from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify

# Create your models here.
class Articles(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)  # 设为unique避免重复slug
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, default = None, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def snippet(self):
        return self.body[:50]+'...'
    
    def save(self, *args, **kwargs):
        # 若slug为空,从标题自动生成
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

额外排查建议

在模板中添加表单错误提示,方便后续快速定位问题:

<form class="newArticleForm" action="/articles/create/" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form }}
    {% if form.errors %}
        <div style="color: red;">
            {% for field in form %}
                {% for error in field.errors %}
                    <p>{{ field.label }}: {{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
    <input type="submit" value="Create">
</form>

内容的提问来源于stack exchange,提问作者user21135338

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:20:31