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

Django函数视图编写求助:带URL参数的用户项目列表视图

Django函数视图获取指定用户项目问题修复方案

问题回顾

我正在学习Django函数视图,配置了urls.py路径path('user/<str:username>',views.UserProjectList,name='user-projects')用于展示指定用户的所有项目,但编写的函数视图始终返回空内容,相关代码及模型如下:

当前函数视图代码

def UserProjectList(request,username):
    user = User.objects.get(username=username) #我认为这不对,应该返回用户id
    #user = User.objects.filter(username=username) #这也不行

    tag_list = ProjectTagsSQL.objects.all() #ProjectTagsSQL与ProjectSQL关联
    project_list = ProjectSQL.objects.filter(client=user) #ProjectSQL表含client_id字段,关联User表主键id

    context = {
        'tagy' : tag_list,
        'projecty' : project_list
    }

    return render(request, 'home_page/user_projects.html', context) #这里需要传参数吗?

参考的可用类视图代码

class UserProjectListView(ListView):
    model = ProjectSQL
    template_name = 'home_page/user_projects.html' 
    context_object_name = 'data'

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return ProjectSQL.objects.filter(client=user)

模型定义

class ProjectSQL(models.Model):
    id = models.AutoField(primary_key=True)
    country = models.TextField()
    city = models.TextField()
    time_added = models.DateTimeField(default=timezone.now)
    start_date = models.DateField()
    end_date = models.DateField()
    client = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        managed = False
        db_table = 'project'

class ProjectTagsSQL(models.Model):
    id = models.IntegerField(primary_key=True)
    project = models.ForeignKey(ProjectSQL, on_delete=models.CASCADE)
    tag = models.ForeignKey(ProjectTagSQL, on_delete=models.CASCADE)

    class Meta:
        managed = False
        db_table = 'project_tags'

修复步骤

1. 正确获取用户对象

User.objects.get(username=username)本身逻辑没问题,Django外键查询支持直接传入User实例,不需要手动传id。但get方法在用户不存在时会抛出异常导致页面崩溃,换成get_object_or_404更稳妥,和类视图逻辑保持一致,用户不存在时返回404页面。

2. 修正标签查询逻辑

当前ProjectTagsSQL.objects.all()会返回所有标签,并非当前用户项目的关联标签。如果需要展示该用户项目的标签,应该过滤出关联用户项目的标签:

tag_list = ProjectTagsSQL.objects.filter(project__client=user)

3. 完整修复后的函数视图

from django.shortcuts import render, get_object_or_404
from .models import User, ProjectSQL, ProjectTagsSQL

def UserProjectList(request, username):
    # 处理用户不存在的情况,返回404
    user = get_object_or_404(User, username=username)
    
    # 获取该用户的所有项目
    project_list = ProjectSQL.objects.filter(client=user)
    # 获取该用户项目关联的所有标签
    tag_list = ProjectTagsSQL.objects.filter(project__client=user)
    
    context = {
        'tagy': tag_list,
        'projecty': project_list,
        'current_user': user  # 可选:把用户对象传到模板,方便展示用户名等信息
    }
    
    # 不需要额外传username参数,context已包含所需数据
    return render(request, 'home_page/user_projects.html', context)

4. 模板验证

确保模板home_page/user_projects.html正确遍历数据,示例:

<h1>{{ current_user.username }}的项目</h1>
<ul>
{% for project in projecty %}
    <li>{{ project.city }} - {{ project.start_date }} 至 {{ project.end_date }}</li>
{% empty %}
    <li>暂无项目</li>
{% endfor %}
</ul>

<h2>项目标签</h2>
<ul>
{% for tag in tagy %}
    <li>{{ tag.tag.name }}</li> <!-- 假设ProjectTagSQL有name字段 -->
{% empty %}
    <li>暂无标签</li>
{% endfor %}
</ul>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:27