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

Django点击问题作者名跳转公共主页路由反向解析报错

报错根因

报错Reverse for 'Public_Profile' with arguments '('',)' not found是多处代码逻辑错误叠加导致:

  • 首页index视图把上下文字典错误包裹在列表中传给模板,模板无法正常解析变量
  • 模板跳转链接使用了未定义的profile.slug变量,没有取当前问题发布者对应的Profile slug,导致传入路由的参数为空字符串
  • Profile模型slug生成、public_profile视图查询存在逻辑隐患,即使跳转成功也会出现数据查询错误
分步修复方案

1. 修复index视图的上下文传值逻辑

去掉context外层的列表包裹,render函数接收字典格式的上下文即可,修正后代码:

@login_required(login_url='login')
def index(request):
    query = request.GET.get('q', None)
    list_of_question = Question.objects.all()
    if query is not None:
        list_of_question = Question.objects.filter(
            Q(title__icontains=query) |
            Q(category__name__icontains=query)
        )
    unread_notifications = Notification.objects.filter(user=request.user, is_read=False).count()

    paginator = Paginator(list_of_question, per_page=15)
    context = {
         'unread_notifications':unread_notifications,
         'list_of_question':list_of_question,
         'paginator':paginator
    }
    return render(request, 'index.html', context)

2. 修复模板中个人主页跳转参数

循环渲染问题时,通过问题关联的发布者用户,取对应的Profile slug,替换原来不存在的profile.slug变量,修正后模板对应代码:

<div class="container">
<div class="row justify-content-center">
    {% for question in list_of_question reversed %}
    <div class="col-md-4">
        <div class="card my-3">
            <div class="card-header">
            <p class="card-title"><a href="{% url 'Public_Profile' question.user.profile.slug %}">
                {{question.user.username.upper}}
            </a></p>
            </div>
            <div class="card-body">
                <a href="{% url 'view-Question' question.slug %}" style="text-decoration: none;">
                    <p class="card-title">{{question.title}}</p>
                </a>
                <h5>{{question.category}}</h5>
            </div>
        </div>
    </div>
    {%endfor%}
</div>
</div>

3. 修复Profile模型的slug生成逻辑

显式指定取用户名字段生成slug,避免直接对User对象转义出现异常,修正后模型代码:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_image = models.ImageField(upload_to='avatar', blank=True, null=True, default='static/default.jpg')
    stories = RichTextField(blank=True, null=True)
    twitter = models.URLField(max_length=300, blank=True, null=True)
    website = models.URLField(max_length=300,blank=True, null=True)
    city = models.CharField(max_length=50, blank=True, null=True)
    location = models.CharField(max_length=80, blank=True, null=True)
    slug = models.SlugField(unique=True, max_length=200)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.user.username)
        super(Profile, self).save(*args, **kwargs)

    def __str__(self):
        return str(self.user)

4. 修复public_profile视图的查询逻辑

原查询条件user=contents逻辑错误,contents本身是Profile实例,关联用户属性为contents.user,修正后代码:

def public_profile(request, slug):
    contents = get_object_or_404(Profile, slug=slug)
    questions = Question.objects.filter(user=contents.user)
    context = {
        'contents':contents,
        'questions':questions
    }
    return render(request, 'public_profile.html', context)
额外注意

需要保证每个注册用户都对应生成一条Profile记录,否则模板取question.user.profile时会抛出关联对象不存在的错误,可以通过Django信号在User创建时自动创建关联Profile。

内容的提问来源于stack exchange,提问作者user19255291

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:12:30