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

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 %}循环内部,跳转链接写法如下:

  1. 跳回当前任务所属清单的列表页:
<a href="{% url 'tasks' task.list.id %}">&#8592; Back</a>
  1. 跳转到当前清单的新建任务页:
<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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:26