【问题标题】:get_absolute_url and reverse outside of templatesget_absolute_url 和模板外的反向
【发布时间】:2023-03-09 13:55:01
【问题描述】:

"...如果你需要在你的代码中使用类似于url模板标签的东西, Django提供了如下函数:reverse()..."

我查看了get_absolute_url()reverse 的文档,以及给出的示例:

a href="{{ object.get_absolute_url }}">{{ object.name }} /a>

我没有看到或理解的是,我们如何将 kwargs(名称、自我、ID 等)传递给模型方法,以便它知道要返回 url 的 100 个实例中的哪一个,特别是在我需要的地方在 text在模板系统之外 中使用它?

a href="name_of_object.get_absolute_url ">对象的文本名称

  1. 我必须将对象的全名放在 href 中吗?
  2. 如何改用 self 或 object 或 modelname 等变量?
  3. 我可以重写 gau 来获取 kwargs 和 self 吗?
  4. 如果我这样做,我可以将 () 放在 gau 的末尾以接收 kwargs 吗?我们不能在模板中这样做。
  5. 我可以使用:

a href="self.get_absolute_url(**kwargs) ">对象的文本名称?


a href="object.get_absolute_url(self, **kwargs) ">文本名称 对象?

  1. 如果是这样,我是否需要在模型上的 gau 定义中添加任何内容以确保将这些 kwargs 传递给返回?

  2. 还是我只是将其视为常规外部链接,因此必须对其进行硬编码?

谢谢。 --更新--

@ChidG:感谢您提供如此完整的答案,很抱歉花了这么长时间才回复您。我想稍微澄清一下我的用例,看看这是否会改变你的答案。如果我有十篇文章使用相同的模板,每篇文章仍然是唯一的,并且它们指向不同 url 的链接不会在每篇文章的同一位置。所以我无法在 template 中放置一个(或多个)url 标签,这对所有十篇文章都有用。这就是我在模板中使用 gau / url 标签 outside 的意思。我想做一个简单的搜索和替换,将受影响的文本变成链接。否则,我必须一次一个地手工完成,我认为 不可能 必须这样做。我错过了什么?

【问题讨论】:

    标签: html django


    【解决方案1】:

    当 Django 的文档说“模板系统之外”时,它们的意思是在 Python 代码中,在 views.py 或 models.py(或任何.py)文件中。您给出的示例似乎都是 HTML(它们具有 a 标签,所以看起来您在谈论 HTML)。

    如果是 HTML,那么它不在模板系统之外,所以你提到的 Python 函数将不起作用。您需要使用 Django 模板标签。

    关于这个问题:

    我没有看到或理解的是,我们如何将 kwargs(名称、自我、ID 等)传递给模型方法,以便它知道要返回 url 的 100 个实例中的哪一个,特别是在我需要的地方在模板系统之外的文本中使用它?

    {{object.get_absolute_url}}(或纯 Python 中的 object.get_absolute_url())不需要 kwarg,因为模型上的 get_absolute_url 方法已经知道如何使用所需的任何 kwargs 生成正确的 URL .如果它还不知道如何执行此操作(由于您的特定 URL 配置),您可以编写一个自定义的 get_absolute_url 方法来启用它。

    每当您从 Django 视图返回 HTML 文件时(除非您正在做一些非常规的事情),您正在使用模板系统。当您使用模板系统时,您使用{{ }} 引用Django 上下文变量,使用{% %} 引用自定义标签。因此,要将 URL 插入到模板中,无论是在 a 标记中还是仅在文本中,您都将使用大括号,它将是 {{ object.get_absolute_url }} 或使用 url 标记本身,{% url 'whatever_url_name' kwarg=value %}

    1. 我必须将对象的全名放在 href 中吗?

    您必须将引用该对象的上下文变量放在模板上下文中。

    1. 如何改用 self 或 object 或 modelname 等变量?

    您可以为上下文变量使用任何您喜欢的名称。如果您使用 Django 的基于类的视图,则默认情况下单个对象视图为 object,但您可以使用视图上的 context_object_name 属性将其更改为您喜欢的任何内容。

    1. 我可以重写 gau 来获取 kwargs 和 self 吗?

    那是不必要的。 get_absolute_url 返回一个完整的 URL,它所需要的只是模型实例。模型实例必须能够使用自己的 get_absolute_url 方法找到自己的 url,而无需任何进一步的 kwargs。

    1. 我可以使用:

    您链接到的 get_absolute_url 的 Django 文档中清楚地展示了正确的语法:

    <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 2011-04-30
      • 2018-04-21
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多