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

Django函数视图如何复用所有视图通用的操作?

Django函数视图重复代码优化方案

重复编写相同的上下文注入和渲染逻辑完全没必要,以下是几种更高效的解决方案,可根据你的实际场景选择:

方法1:封装公共工具函数

把重复的逻辑抽成独立函数,每个视图只需调用它来获取基础上下文,再按需补充自定义参数:

from django.shortcuts import render
from .models import resource

def get_base_context():
    resource_list = resource.objects.all()
    return {'resourcelist': resource_list}

# 示例视图
def dashboard_view(request):
    context = get_base_context()
    # 按需添加自定义参数
    context['user_info'] = request.user
    return render(request, 'dashboard.html', context)

def detail_view(request, pk):
    context = get_base_context()
    context['resource_detail'] = resource.objects.get(pk=pk)
    return render(request, 'detail.html', context)

方法2:使用装饰器注入上下文

如果希望自动为视图注入基础上下文,无需手动调用工具函数,可以编写装饰器:

from django.shortcuts import render
from django.http import HttpResponse
from .models import resource

def inject_resource_list(view_func):
    def wrapper(request, *args, **kwargs):
        result = view_func(request, *args, **kwargs)
        # 若视图返回字典,则注入基础参数并完成渲染
        if isinstance(result, dict):
            result['resourcelist'] = resource.objects.all()
            return render(request, view_func.template_name, result)
        # 若视图直接返回HttpResponse,原样返回
        return result
    return wrapper

# 装饰器使用示例
@inject_resource_list
def profile_view(request):
    profile_view.template_name = 'profile.html'
    # 仅返回自定义参数即可
    return {'user_profile': request.user.profile}

@inject_resource_list
def empty_view(request):
    empty_view.template_name = 'empty.html'
    return {}

方法3:全局上下文处理器(适合全模板通用场景)

如果所有模板都需要resourcelist变量,无需修改任何视图,直接用Django的全局上下文处理器:

  1. 在你的app目录下创建context_processors.py:
from .models import resource

def resource_list_processor(request):
    return {'resourcelist': resource.objects.all()}
  1. 在项目settings.py的TEMPLATES配置中添加该处理器:
TEMPLATES = [
    {
        # 其他配置项...
        'OPTIONS': {
            'context_processors': [
                # 默认的处理器(如django.contrib.auth.context_processors.auth等)
                'your_app_name.context_processors.resource_list_processor',
            ],
        },
    },
]

配置完成后,所有模板都能直接使用{{ resourcelist }}变量,视图无需做任何额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:46