【问题标题】:What is @permalink and get_absolute_url in Django?Django 中的@permalink 和 get_absolute_url 是什么?
【发布时间】:2012-11-21 23:20:02
【问题描述】:

Django 中的@permalinkget_absolute_url 是什么?何时以及为什么使用它?

请举一个非常简单的例子(一个真正的实际例子)。谢谢

【问题讨论】:

    标签: django


    【解决方案1】:

    截至 2013 年,Django 文档不鼓励使用永久链接装饰器,并鼓励在 get_absolute_url 方法的主体中使用 reverse()。到 2015 年,永久链接装饰器似乎已经消失了,在 Django 文档中没有留下任何痕迹,最终在 2018 年变成了 removed in Django version 2.1

    因此,对于创建指向单个对象视图的永久链接的标准 DRY 方法,请在模型中使用 get_absolute_url(),如下所示:

    from django.db import models
    from django.urls import reverse
    #  NOTE: pre Django 1.10+ this is "from django.core.urlresolvers import reverse"
    
    
    class MyModel(models.Model):
        slug = models.SlugField()
    
        def get_absolute_url(self):
            return reverse('mymodel_detail', args=(self.slug,))
    

    然后在 urls.py 中有一个条目指向您的视图:

    url(r'^(?P<slug>[-\w\d\_]+)/$',
        MyModelDetailView.as_view(),
        name='mymodel_detail'),
    

    【讨论】:

    • 在 Django 2.0 中,reverse 应该从 django.urls 导入,否则你会得到一个 ModuleNotFoundError
    【解决方案2】:

    @permalink 是 python decorator,而get_absolute_url 是 django 模型上的方法。

    两者都允许您反转特定对象的 URL,应该一起使用。当您需要提供指向特定对象的链接或想要向用户显示该对象的特定 URL(如果有)时,可以使用它们

    您可以简单地编写您的 get_absolute_url 方法来返回一个硬编码的字符串,但这不符合 Django 的 DRY 哲学(不要重复自己)。相反,@permalink 可以让事情变得更加灵活。

    如果您阅读the docs on the subject,您将了解它们之间的关系。 @permalink 装饰器挂钩到 django 的 URLconf 的后端,允许您使用 named url patterns 编写更便携的代码。这比单独使用get_absolute_url 更可取:您的代码变得更加干燥,因为您不必指定路径。

    class BlogPost(models.Model):
        name = modelsCharField()
        slug = models.SlugField(...)
    
        @permalink
        def get_absolute_url(self):
            return ("blog-detail", [self.slug,])
    

    在 urls.py 中

        ...
        url(r'/blog/(?P<slug>[-w]+)/$', blog.views.blog_detail, name="blog-detail")
    

    【讨论】:

    【解决方案3】:

    在 Django 2.1 中 django.db.models.permalink() 装饰器被移除。

    source

    【讨论】:

      【解决方案4】:

      更好的方法是在 urls.py 中为您的应用声明一个名称,然后引用它而不是硬编码任何东西:

      在 urls.py 中:

      app_name = 'my_app'
      
      urlpatterns = [
          path('blogs/<int:slug>', blog.views.blog_detail, name='mymodel_detail'),
          ]
      
      

      在models.py中:

      from django.urls import reverse
      
      
      class BlogPost(models.Model):
          name = modelsCharField()
          slug = models.SlugField(...)
      
          def get_absolute_url(self):
              return ('my_app:mymodel_detail, args=[self.slug,])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        相关资源
        最近更新 更多