覆盖 Django 渲染方法

Posted

技术标签:

【中文标题】覆盖 Django 渲染方法【英文标题】:Override Django Render Methods 【发布时间】:2017-12-11 19:51:33 【问题描述】:

使用以下渲染器...

from django.shortcuts import render
...
return render(request, 'template.html', 'context':context,)

是否可以覆盖渲染类的方法,以便在某些情况下我可以自己解释模板标签,例如,如果我找到由某种格式组成的标签,例如...

% url 'website' page.slug %

我可以把它指向...

/theme/theme-1/page.html

/theme/theme-2/page.html

取决于多余的设置。

【问题讨论】:

【参考方案1】:

render 方法只是一个快捷方式:

template = loader.get_template(''template.html')
context = 
    ...,

return HttpResponse(template.render(context, request))

因此,尝试改变 url 标签的行为并不是正确的地方。

对于您给出的示例,网站看起来应该是一个包含theme-1theme-2 的变量。然后,您可以将变量传递给 url 标记,而不是字符串 'website'

% url website page.slug %

如果这不可行,您可以创建一个 custom template tag my_url,根据您的设置返回正确的 url。

【讨论】:

其他人将负责创建模板并本能地使用 % url % 我只想能够在一个程序中加载多个网站并在必要时拦截路由。这将是一个主题库,但代码必须在添加到实际站点后才能正常运行。 正如@alasdair 指出的那样,您应该尝试自定义模板标签,而不是更改渲染的默认行为。查看此 SO 帖子以获取示例 ***.com/questions/6451304/… 您可以使用 BUILTINS 选项将 Django 的 url 标签替换为您自己的标签。我不认为这是一个好主意。你也可以看看TemplateResponse 而不是render,因为它有额外的钩子。

以上是关于覆盖 Django 渲染方法的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 django 视图的正确方法是啥

Django - 覆盖 Model.create() 方法?

如何以 django 模型形式覆盖保存方法

Django覆盖模型get()方法不适用于外键

Django覆盖详细视图获取方法

Django 信号与覆盖保存方法