Django类视图按DB字段过滤及模板URL传参实现方案
Django待办清单功能实现方案
一、类视图新增按list外键过滤任务
首先调整TaskList对应的路由,接收清单ID路径参数,同时修正原有create路由的参数类型,使用整型主键传参更规范:
# urls.py from django.urls import path from .views import TaskList, TaskCreate urlpatterns = [ path('tasks/<int:list_id>/', TaskList.as_view(), name='tasks'), path('tasks/<int:list_id>/create/', TaskCreate.as_view(), name="task-create"), ]
改造TaskList视图逻辑,新增外键过滤,同时补充越权校验和404处理:
注意:必须校验待过滤的清单属于当前登录用户,避免越权访问其他用户的数据;使用
get_object_or_404处理不存在的清单ID,避免服务器500错误。
# views.py from django.shortcuts import get_object_or_404 from django.views.generic.list import ListView from django.contrib.auth.mixins import LoginRequiredMixin from .models import Task, ToDoList class TaskList(LoginRequiredMixin, ListView): model = Task context_object_name = "tasks" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 从URL路径获取清单ID,校验清单归属当前用户 list_id = self.kwargs.get('list_id') target_list = get_object_or_404(ToDoList, id=list_id, user=self.request.user) # 叠加过滤条件:当前用户 + 所属指定清单,加select_related优化外键查询性能 context['tasks'] = context['tasks'].filter( user=self.request.user, list=target_list ).select_related('list') context['count'] = context['tasks'].filter(complete=False).count() # 将当前清单对象传入模板,方便页面渲染和跳转使用 context['current_list'] = target_list # 原有搜索逻辑保留 search_input = self.request.GET.get('search-area') or '' if search_input: context['tasks'] = context['tasks'].filter(title__startswith=search_input) context['search_input'] = search_input return context
二、模板访问外键字段与路径参数跳转
Django模板完全支持通过.语法访问外键关联的对象属性,你原有写法存在两个错误:
- 给变量加了引号,导致
'task.list'被识别为普通字符串而非模板变量 - 路由传参需要传递可序列化的具体值(一般为主键ID),而非直接传递对象实例
正确写法
如果是在{% for task in tasks %}循环内部,跳转链接写法如下:
- 跳回当前任务所属清单的列表页:
<a href="{% url 'tasks' task.list.id %}">← Back</a>
- 跳转到当前清单的新建任务页:
<a href="{% url 'task-create' task.list.id %}">新建任务</a>
如果是在循环外,直接用视图传入的current_list变量即可:
<a href="{% url 'task-create' current_list.id %}">在当前清单新建任务</a> <p>当前清单名称:{{ current_list.title }}</p>
模板中可以直接通过.取关联对象的任意字段,比如task.list.title可以直接输出任务所属清单的标题,不需要额外做处理。
内容的提问来源于stack exchange,提问作者Alycia Clark
相关产品推荐
相关产品推荐

