gpt4 book ai didi

python - Django:高效的模板/字符串分离和覆盖

转载 作者:太空狗 更新时间:2023-10-29 17:50:54 24 4
gpt4 key购买 nike

我有一个呈现模板的通用 Django View 。该模板位于其他项目将使用的应用程序中。导入项目通常会将应用程序提供的 View 子类化。 View 有一个默认模板,它使用通用措辞来完成工作。

99% 的时间,子类 View 将只想更改文本,因此与其为了更改非标记措辞而让它们复制模板,我正在寻找一种方法来允许类的用户以最有效的方式替换模板中的措辞。

到目前为止探索的选项:

  • 模板部分仅包含使用应用程序可以覆盖的文本(魔术,大量用户工作)
  • View 上的一个template_strings 方法,它提供了一个字符串字典,这些字符串最终出现在子类可以覆盖的模板上下文中
  • 使用(滥用?)翻译系统,使应用程序提供默认的英语翻译,并使用代码来提供自己的翻译(还没有真正解决这个问题,只是一个想法)
  • 通过 AppConfig 执行上面的 template_strings,但这看起来......令人讨厌,因为它可能会因为很多英文字符串而变得非常笨拙。如果这样做,我会创建一个类似上下文的设置,这样您就不必重新声明所有字符串

似乎子类化完成完整工作的 View 应该是一个已解决的问题,并且只为文本提供替代字符串。有没有比上面更好的方法?习俗?我缺少什么?

(django 1.11 Python 3.6.2)

最佳答案

您可以继承 TemplateView或添加 ContextMixin在您的 View 中,然后重写 get_context_data 函数,如下所示:

from django.views.generic import TemplateView

class BaseView(TemplateView):
template_name = "common.html"

class SubView(BaseView):
def get_context_data(self, **kwargs):
context = super(SubView, self).get_context_data(**kwargs)
context['content'] = "Some sub view text"
return context

更新:使用模板覆盖

如果你想把文本分开,这是更好的方法为了允许跨应用程序轻松和 DRY 覆盖模板,您可能需要安装此 package (其他一些细节 here )

我们的定义与上面类似,但是更改了template_name:

from django.views.generic import TemplateView

class BaseView(TemplateView):
template_name = "main.html"

# on another app
class SubView(BaseView):
template_name = "sub_view.html"

那么神奇的是你可以像这样扩展并覆盖BaseView模板的block:

base_app/templates/main.html

<p>I'm Common Text</p>
{% block main %}
<p>I'm Base View</p>
{% endblock %}

sub_app/templates/sub_view.html

{% extends "base_app:main.html" %}
{% block main %}
<p>I'm Sub View</p>
{% endblock %}

结果是:

<p>I'm Common Text</p>
<p>I'm Sub View</p>

关于python - Django:高效的模板/字符串分离和覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45653812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com