Django 保存修改表单后返回 “This field is required.”

简述:
创建一个博客项目,Django项目其命名为Blog。
这个项目中,创建一个名为blogs的应用程序,在其中创建一个名为BlogPost 的模型。这个模型包含title 、text 和date_added 等字段。
创建一个主页,在其中按时间顺序显示所有的帖子。
创建两个表单,其中一个用于发布新帖子,另一个用于编辑既有的帖子。

我在已经完成完成到了最后的部分,即编辑帖子的功能
主页部分显示如下

Django 保存修改表单后返回 “This field is required.”
点击“编辑此博客”可以来到编辑博客页面

Django 保存修改表单后返回 “This field is required.”
对博客内容做一些修改

Django 保存修改表单后返回 “This field is required.”
点击“保存修改”按钮来保存修改,会自动跳转为“This field is required.”

Django 保存修改表单后返回 “This field is required.”

(对字段 title 和 text 同时做出修改也是一样的情况,出现This field is required.即无法保存表单修改)

URL模式
主页

re_path(r'^$',views.blogposts,name = 'blogposts')

编辑博客页面

 re_path(r'^edit_blog/(?P<blog_id>\d+)/$',views.edit_blog,name = 'edit_blog')

视图函数(编辑博客界面)

def edit_blog(request,blog_id):
    '''编辑博客'''
    #获取当前博客的id
    blog = BlogPost.objects.get(id = blog_id)
    t = blog.title
    #处理两种请求情形
    if request.method != 'POST':
        #返回使用当前内容填充的表单
        b = BlogPostForm(instance = blog)
    else:
        #当请求为POST时,利用当前内容和request.POST的内容填充表单
        b = BlogPostForm(instance = blog,data = request.POST)
        #当内容合格时,保存内容
        if b.is_valid():
            b.save()
            #在保存之后返回博客主页
            return  HttpResponseRedirect(reverse('blogs:blogposts'))
    #将内容发送给模板
    context = {'blog':blog,'t':t,'b':b}
    return render(request,'blogs/edit_blog.html',context)

在预想中,调用save之后应该返回URL模式 blogs:blogposts (主页)

模板edit_blog.html

{% extends "blogs/base.html" %}

{% block content %}
  <p>{{ t }}</p>
  <p>{{ b }}</p>
  <form action="{% url 'blogs:edit_blog' blog.id %}" method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <button name="submit">保存修改</button>
  </form>

{% endblock content %}

请问这是否是返回页面的环节出了问题,还是关于表单实例中有未设置的地方,希望有前辈能指点迷津

最佳答案

知识的盲区,我想我还得再去学习一些知识然后回来解决这个问题。

3年前 评论
讨论数量: 9

建议在“b = BlogPostForm(instance = blog,data = request.POST)”这行上面打印下request.POST的值看看是不是有你的那些字段。

3年前 评论
compass (楼主) 3年前
compass (楼主) 3年前

直接加上 print(request.POST),python manage.py runserver ,访问的时候就会打印出来

3年前 评论
compass (楼主) 3年前
compass (楼主) 3年前
Jason990420

不知道细节为何, 只好随意回答 : )

会不会你在 model 的定义中, content 的属性没设好
预设所有栏位都是 blank=False, 验证要求是不可为空白.
3年前 评论
compass (楼主) 3年前

model

class BlogPost(models.Model): '''定义博客模型'''

#标题字段
title = models.CharField(max_length = 200 ,blank=True)
#正文字段
text = models.TextField(blank=True)
#时间字段
date_added = models.DateTimeField(auto_now_add = True )
#返回标题字段,这样我们可以看到标题
def __str__(self):
    return  self.title

编辑博客内容 file

保存后再回到页面 file

修改的内容没被保存下来。 这是什么情况呢,缺少了什么参数吗

3年前 评论
Jason990420

會不會是, 没有 render(request,'blogs/edit_blog.html',context)

    if request.method == 'POST':
        #当请求为POST时,利用当前内容和request.POST的内容填充表单
        b = BlogPostForm(instance = blog,data = request.POST)
        #当内容合格时,保存内容
        if b.is_valid():
            b.save()
            #在保存之后返回博客主页
            return  HttpResponseRedirect(reverse('blogs:blogposts'))
3年前 评论
compass (楼主) 3年前
Jason990420 (作者) 3年前

打开一个 内容已经没有的条目,输入内容,点击保存

file

主页上的这个条目除了时间戳外没有显示刚才编辑的内容

file

创建一个新的条目,保存新条目

file

主页上有显示新内容

file

这是否可以认为是编辑条目页没有保存编辑后的内容呢?

3年前 评论
Jason990420

你可以查询你的数据库就知道了啊, 如果没存就看你自己的代码是怎么处理的, 软件设计要试着自己找问题, 侦错, 要不然, 会不明所以然.

3年前 评论
compass (楼主) 3年前

查询数据库,可知数据编辑后没有成功保存

file

那么问题应该可能出在这两个地方

file

打印data,内容为空

file

3年前 评论

知识的盲区,我想我还得再去学习一些知识然后回来解决这个问题。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!