Django使用DetailView开发用户详情页加载文章报错求助
问题根因
报错profildetailview.get_object() missing 1 required positional argument: 'request'来自三个核心错误:
- 代码缩进错误:你写的
get方法没有缩进在ProfilDetailView类内部,类视图完全没有识别到这个自定义方法,仍然执行父类DetailView的默认逻辑,默认逻辑要求URL参数包含pk或slug用来查询对象,和你传入的username参数不匹配 - 依赖缺失:代码里没有导入
YazilarModel和render函数,就算缩进正确运行也会报导入错误 - 查询逻辑错误:
get_object_or_404只能返回单条数据,你用它查询用户的多篇文章会直接抛错;且yazar是关联用户模型的外键字段,你传入profil.username(字符串)不符合字段预期,应该传入用户实例。
修复方案
不需要重写整个get方法,利用DetailView自带的扩展点实现即可,代码更简洁也更符合Django开发规范。
1. 修正视图代码(profile.py)
from django.shortcuts import get_object_or_404 from django.views.generic import DetailView from account.models import CustomUserModel # 补充缺失的模型导入 from forum.models import YazilarModel class ProfilDetailView(DetailView): template_name = 'pages/profil.html' context_object_name = 'profil' def get_object(self, queryset=None): # 重写对象查询逻辑,按URL中的username匹配用户 return get_object_or_404(CustomUserModel, username=self.kwargs.get('username')) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 把当前用户发布的所有文章传入模板上下文 context['yazilar'] = YazilarModel.objects.filter(yazar=self.object) return context
额外优化:你的
YazilarModel中yazar外键已经设置了related_name='yazilar',你可以直接删掉get_context_data方法,在模板里通过{{ profil.yazilar.all }}直接获取对应用户的所有文章,不需要额外查询。
2. 补充模板中的文章渲染逻辑
你当前的profil.html没有渲染用户文章的代码,在内容区末尾的<hr>标签后添加以下代码即可展示文章列表:
<h4>Kullanıcının Paylaştığı Yazılar</h4> <div class="row mt-3"> {% for yazi in yazilar %} <div class="col-md-6 mb-3"> <div class="card"> {% if yazi.resim %} <img src="{{ yazi.resim.url }}" class="card-img-top" alt="{{ yazi.baslik }}"> {% endif %} <div class="card-body"> <h5 class="card-title">{{ yazi.baslik }}</h5> <p class="card-text">{{ yazi.icerik|safe|truncatewords:30 }}</p> </div> </div> </div> {% empty %} <p>Bu kullanıcı henüz hiç yazı paylaşmamış.</p> {% endfor %} </div>
如果用上面说的related_name优化,把循环里的yazilar替换成profil.yazilar.all即可。
3. 其他需要修正的细节
- 删除重复导入的
get_object_or_404,你代码里导入了两次这个函数 - 所有类的方法必须保持正确缩进,放在类的代码块内部,否则Django不会将其识别为类的重写方法
- 查询多条数据时使用
filter(),get_object_or_404仅用于查询确定唯一的单条记录
内容的提问来源于stack exchange,提问作者Tolga Şahin
相关产品推荐
相关产品推荐

