【问题标题】:Passing object as kwargs to URL tag in template?将对象作为 kwargs 传递给模板中的 URL 标记?
【发布时间】:2021-06-04 12:28:20
【问题描述】:

假设我有一个像下面这样的模型

from django.db import models
class Person(models.Model):
    first_name = models.CharField(max_length=36)
    last_name = models.CharField(max_length=36)

我在urls.py 中有一个类似的网址

path(r'profile/<str:first_name>/<str:last_name>/', ..., name='profile')

在模板中,如果有一个变量person,我可以通过输入{% url "profile" person.first_name person.last_name %} 来获取他们的个人资料网址。

但是,我真的不想重复自己,而是按照{% url "profile" **person %} 的方式做更多的事情——这不是一个有效的语法,但重点是我想使用 person 的属性作为参数网址标签。这样,如果我将 URL 模式更改为也使用 middle_name,我就不需要再次编辑模板。

是否有(最好是内置的,但自定义标签也可以)方法来做到这一点?我在谷歌上花了一段时间查询“django url template tag kwargs”,但没有找到任何东西。 (而且我想避免更改 URL 本身,因为它会暴露给最终用户。)

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    您可以简单地向模型类添加一个方法,该方法将返回该模型的正确 url,而不是使用模板标签。一个常用的方法是get_absolute_url [Django docs],它甚至被基于类的视图用来在成功提交表单等之后获取要重定向的url。你的实现可能是这样的:

    from django.db import models
    from django.urls import reverse
    
    
    class Person(models.Model):
        first_name = models.CharField(max_length=36)
        last_name = models.CharField(max_length=36)
        
        def get_absolute_url(self):
            return reverse('profile', kwargs={'first_name' : self.first_name, 'last_name': last_name})
    

    现在您可以在模板中简单地编写:

    {{ person.get_absolute_url }}
    

    注意:名字和姓氏不是很好的 url 参数,因为一个人的名字中可能有空格等。

    【讨论】:

    • 谢谢,应该可以。 (名字和姓氏只是一个例子,与我的实际任务无关。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2017-11-11
    • 1970-01-01
    • 2016-10-18
    • 2018-03-08
    • 2019-03-11
    相关资源
    最近更新 更多