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
相关产品推荐
相关产品推荐

