Django中BlogUpdateView对象无date属性,改用函数视图仍报错求助
搞定'BlogUpdateView' object has no attribute 'date'报错
嘿,我来帮你捋清楚这个问题!这个报错的核心原因几乎板上钉钉:你的post_update.html模板里,错误地试图从视图对象(比如写了{{ view.date }})里取date属性,但date明明是Post模型的字段,属于你要编辑的那篇文章实例,根本不是视图本身的东西。
一步步修复:
先查模板,这是最可能的问题
打开你的post_update.html,找找有没有类似{{ view.date }}的代码。把它改成引用文章实例的date字段就行:{{ object.date }} <!-- 要是你用函数视图的时候,给模板传的变量名是post,就写成{{ post.date }} -->顺便说下,Django的
UpdateView默认会把当前要更新的文章实例以object为键传到模板里,所以用{{ object.date }}肯定没问题。优化你的类视图(可选,但更规范)
你的BlogUpdateView其实能简化,不用自己写get_object方法,Django已经帮你做好了:class BlogUpdateView(UpdateView): template_name = "post_update.html" form_class = BlogForm model = Post pk_url_kwarg = 'id' # 因为你的URL里用的是id当主键参数这样写更简洁,也不容易出错。
函数视图的坑要注意
如果你换用函数视图,一定要记得把获取到的Post实例传到模板上下文里,比如:def post_update(request, id): post = get_object_or_404(Post, id=id) if request.method == 'POST': form = BlogForm(request.POST, instance=post) if form.is_valid(): form.save() return redirect(post.get_absolute_url()) else: form = BlogForm(instance=post) # 这里必须把post传进去,模板才能拿到它的date字段 return render(request, 'post_update.html', {'form': form, 'post': post})要是你没传这个实例,或者模板里还是写错了变量名,那报错肯定还会出现。
为啥换函数视图还报错?
因为问题根本不在视图是类还是函数,而是模板里的变量引用错了对象!不管用哪种视图,只要你在模板里硬要从视图对象拿date,就一定会触发这个错误。
内容的提问来源于stack exchange,提问作者Kavi Harjani
相关产品推荐
相关产品推荐

