为何出现AttributeError: 'function'无'day'属性?Django博客视图问题
嘿,这个错误我之前踩过坑!核心问题出在你Post模型里的slug字段配置上,咱们一步步来解决:
解决AttributeError: 'function' object has no attribute 'day' 错误
首先,这个报错的根源很明确:你Post模型中slug字段的unique_for_date参数指向的不是一个有效的日期字段,而是一个函数/方法对象。unique_for_date要求必须传入模型中实际存在的DateField或DateTimeField字段名,当Django尝试验证slug的唯一性时,会去访问该字段的day属性,可如果指向的是函数,自然就会抛出这个错误。
从你给出的代码片段看,你写的是unique_for_date='p...'——大概率是你想指向一个日期字段(比如publish或posted_at),但要么这个字段根本没定义,要么你不小心写成了某个方法的名字。
第一步:修正Post模型的slug字段
先给Post模型补上一个有效的日期字段,再把unique_for_date正确指向它,示例如下:
from django.db import models from django.utils.text import slugify class Post(models.Model): title = models.CharField(max_length=200) short_description = models.CharField(max_length=350) # 新增日期字段,比如文章发布时间 publish_time = models.DateTimeField(auto_now_add=True) # 把unique_for_date指向上面的日期字段名 slug = models.SlugField(unique_for_date='publish_time') # 可选:自动生成slug(如果你的表单没手动处理slug的话) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) super().save(*args, **kwargs)
第二步:修复CreateView的潜在配置问题
另外注意,你CreateView里的redirect_field_name设置有点误区:这个参数是用来指定登录后跳转的URL参数名(比如?next=/blog/post/1/里的next),不是创建成功后的跳转页面。如果想指定成功跳转目标,应该用success_url或者重写get_success_url方法:
from django.views.generic.edit import CreateView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse from .models import Post from .forms import PostForm class CreatePostView(LoginRequiredMixin, CreateView): login_url = '/login/' # redirect_field_name用默认的'next'即可,或直接删除使用默认值 redirect_field_name = 'next' model = Post form_class = PostForm # 重写方法跳转到刚创建的文章详情页 def get_success_url(self): return reverse('post_detail', kwargs={'slug': self.object.slug})
最后验证修改
修正模型后,别忘了运行数据库迁移:
python manage.py makemigrations python manage.py migrate
这样应该就能彻底解决那个AttributeError了!
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

