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

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

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

点击 “编辑此博客” 可以来到编辑博客页面

对博客内容做一些修改

点击 “保存修改” 按钮来保存修改,会自动跳转为 “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')


博客模型
class BlogPost(models.Model):
'''定义博客模型'''
#标题字段
title = models.CharField(max_length = 200)
#正文字段
text = models.TextField()
#时间字段
date_added = models.DateTimeField(auto_now_add = True)
#返回标题字段,这样我们可以看到标题
def __str__(self):
return self.title


表单
class BlogPostForm(forms.ModelForm):
class Meta:
model = BlogPost
fields = ['title','text'] #获取标题和正文
labels = {'title':'','text':''} #指定空标签
widgets = {'text':forms.Textarea(attrs={'cols':80})}#修改默认宽度


视图函数(编辑博客界面)
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 %}


问题以及描述地较为详细了,请问这是否是返回页面的环节出了问题,还是关于表单实例中有未设置的地方,希望有前辈能指点迷津
...全文
1736 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪地猢狲 2020-07-01
  • 打赏
  • 举报
回复
from django.db import models # 在这里创建模型. 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 解决方法:在字段内容加入属性 blank = Ture 预设所有栏位都是 blank=False, 验证要求是不可为空白。
雪地猢狲 2020-06-30
  • 打赏
  • 举报
回复
希望有前辈指点一下
雪地猢狲 2020-06-29
  • 打赏
  • 举报
回复
我的理解是传递data内容,在原有内容上进行编辑,然后保存到数据库。这里的“保存修改”应该是保存编辑后的内容,没有生成新的博客,但也没有成功保存,只是跳转为“This field is required”
放风喽 2020-06-29
  • 打赏
  • 举报
回复
我直接学的前后分离,没学这个。我认为是视图函数的问题。post请求,先通过id获取原来的博客。再将博客的标题和内容修改为request.data。最后保存。 你直接保存,就是保存新的博客了吧。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧