从模板访问模型实例,无需自定义fi

2024-04-26 07:04:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我还没有看到任何人实现这种模式,我渴望了解它在技术上是否可行。让我提供一个使用自定义过滤器的模式的示例:

在本例中,“get_widget”过滤器将查找作为第一个参数传入的名称或键的MyWidget对象

模板逻辑

{% get_widget "whizbang" as item %}
<h1>{{item.name}}</h1>

{% get_widget "1234" as item %}
<h1>{{item.name}}</h1>

自定义过滤器

@register.assignment_tag(takes_context=True)
def get_widget(context, widget_name):

    try:
        return MyWidget.objects.get(name=widget_name)
    except MyWidget.DoesNotExist:
        return None

但这似乎相当可怕

我想看到的是更具动态性的东西:

例如: 根据MyWidget的名称“whizbang”检索MyWidget的实例,或者使用它的键检索MyWidget的实例。 在模板中:

<h1>{{MyWidget.whizbang}}</h1>
<h1>{{MyWidget.1234}}</h1>

问题有两个方面:

  1. 是否可以将一个单件/工厂传递给 请求上下文
  2. 是否有Python机制“拦截”方法 在执行之前调用并解释它

Tags: 实例name名称模板过滤器getreturnas
1条回答
网友
1楼 · 发布于 2024-04-26 07:04:32

在筛选Python文档之后,它看起来像是__getattrr__()和传入类名的组合。我很抱歉回答了我自己的问题。希望这对其他人有用

模板

{{ Menus.HeyDude.DoSomething }}

课程

from mycode import Menu
class MenuFactory():
    def __getattr__(self, name):
        try:
            return Menu.object.get(name=name)
        except Menu.DoesNotExist:
            raise AttributeError

Middlewear上下文处理器

from mycode import MenuFactory
def context_processor(request):

    return_val = {}

    # Add all of the factories
    return_val['Menus'] = MenuFactory
    return return_val

相关问题 更多 >