You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用DetailView开发用户详情页加载文章报错求助

问题根因

报错profildetailview.get_object() missing 1 required positional argument: 'request'来自三个核心错误:

  1. 代码缩进错误:你写的get方法没有缩进在ProfilDetailView类内部,类视图完全没有识别到这个自定义方法,仍然执行父类DetailView的默认逻辑,默认逻辑要求URL参数包含pk或slug用来查询对象,和你传入的username参数不匹配
  2. 依赖缺失:代码里没有导入YazilarModel和render函数,就算缩进正确运行也会报导入错误
  3. 查询逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:57:16