【问题标题】:What is wrong with my Django templating use of if's?我的 Django 模板使用 if 有什么问题?
【发布时间】:2013-04-07 00:16:09
【问题描述】:
{% for url in urls %}
    <a id="URL_url_{{ url.id }}" class="edit_rightclick"
      title="RIGHT click to edit."
      href="{% if ":" not in url.url %}http://{% endif %}{{ url.url }}">{{ url.url }}</a>
    <span class="delete" id="URL_{{ url.id }}">&amp;#10008;</span> &nbsp;
{% endfor %}

试探法旨在将部分或完整 URL(如 google.com)的值添加到前面,假设有时人们会粘贴完整的浏览器 URL,有时人们会输入 google.com 而从不输入 'http: //'。

模板引擎抱怨 '{% if ":" not in url.url %}' 是无效的语法。这里正确的语法/方法是什么?

【问题讨论】:

  • 为什么不在服务器端逻辑而不是模板中对其进行规范化?
  • http:// 很丑。我可以在模板中存储带有完整地址的 URI,或者我可以通过存储显示 URL 和实时使用 URL 使我的代码更复杂。事实上,我想调试的 20-30 个字符的代码段可能比在服务器端重构东西要少调试,这样它就可以跟踪所有这些。
  • 你不会为https://链接负责,对吧?
  • https:// 已经被条件处理了,它作为启发式检查冒号的存在,并将捕获 HTTPS URL 并正确存储和生成它们。协议所在的前缀 http:// 是适当的基本行为;习惯性地输入 jonathanscorner.com 的人可能想要jonathanscorner.com,而不是jonathanscorner.com:8443
  • 如果有条件,我遇到了另一个类似的错误:虚线链接有问题吗?为什么这两个条件是“{% if “:” not in url.url %}”和“{% if time_zone.0 == entity.time_zone %}”。我想知道为什么不再尊重这些条件,引发语法错误。

标签: python django django-templates


【解决方案1】:

作为使用内联模板语句或模板过滤器的替代方法,您可以在模型上创建一个方法/属性来处理 url 创建逻辑。假设您的 Url 是一个模型:

class Url(models.model):
    url = model.TextField()

    @property
    def full_url(self):
        if ":" not in url.url:
            ....
        return full_url

并直接在模板中使用

    href="{{ url.full_url }}">{{ url.url }}</a>

模板保持干净并且没有“业务逻辑”,这可能是一个很好的方法,例如如果您有设计师创建 html/css 模板

编辑:这也让您可以在 full_url 属性中执行更高级的逻辑(例如检查垃圾邮件、损坏的链接等)

【讨论】:

  • “这也使您可以在 full_url 属性中执行更高级的逻辑(例如检查垃圾邮件、损坏的链接等)”您也可以在过滤器中执行此操作。如果这变得复杂 - 业务逻辑不应该在 Url 类或 templatetags 模块中。我知道这两种方法都很好,但我个人更喜欢保持从 models.model 继承的任何东西都非常简单(那里没有模板或业务逻辑)。
  • 如果严格来说是将孤立的数据块从一种格式转换为另一种格式以渲染到模板,那么过滤器绝对是要走的路。如果数据将通过其他方式访问(例如,如果模型用于创建无需模板即可访问的 Python API),最好使用模型属性。
【解决方案2】:

为此使用过滤器怎么样:

href="{{ ulr.url|urlize }}"

记得在构建自己的之前检查这里(查找 urlize): https://docs.djangoproject.com/en/dev/ref/templates/builtins/


我认为更好的方法是将网址保存为管理员中的绝对网址,并在显示链接时去掉“http://”...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    相关资源
    最近更新 更多