从模板访问模型实例,无需自定义过滤器

时间:2014-12-29 19:56:47

标签: python django

我还没有看到任何人实施这种模式,我很想知道它是否在技术上可行。让我举一个使用自定义过滤器看样子的示例:

在此示例中,“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”,或者使用它的密钥。 在模板中:

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

问题有两个:

  1. 是否可以将单身人士/工厂传递给 request_context
  2. 是否存在“拦截”方法的Python机制 在它被执行之前调用并解释它?

1 个答案:

答案 0 :(得分:0)

在筛选完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

中衣背景处理器

from mycode import MenuFactory
def context_processor(request):

    return_val = {}

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