博客五部曲之一 - 简单博客


1219 浏览 5 years, 4 months

19 URL链接以及获取绝对URL

版权声明: 转载请注明出处 http://www.codingsoho.com/

在列表视图,我们打算加一些链接可以直接跳转到对应的详情视图。

(1) 可以用绝对地址,例如

    {% for object in object_list %}
        <a href="/posts/{{object.id}}">{{object.title}}</a><br>
        {{object.id}}<br>
    {% endfor %}

绝对地址是有缺陷的,如果URL映射改了,那么对应的所有模板内容都要修改。

(2) 也可以通过URL名字映射,修改URL映射表给详情视图URL添加名字detail

urlpatterns = [
    url(r'^$', views.post_list),
    url(r'^create/', views.post_create),
    url(r'^(?P<id>\d+$)', views.post_detail, name="detail"),    
    url(r'^update/', views.post_update),
    url(r'^delete/', views.post_delete),
]

在模板里,使用url来获取地址,这儿要把id参数也传进去

    {% for object in object_list %}
        <a href="{% url 'detail' id=object.id %}">{{object.title}}</a><br>
        {{object.id}}<br>
    {% endfor %}

(3) 对于model detail视图,我们可以通过get_absolute_url函数直接在model里定义好它的绝对URL

首先在model里定义get_absolute_url函数

class Post(models.Model):
    def get_absolute_url(self):
        return "/posts/%s" % (self.id )

在post_detail.html里,用get_absolute_url方法获取绝对地址

    {% for object in object_list %}
        <a href="{{ object.get_absolute_url }}">{{object.title}}</a><br>
        {{object.id}}<br>
    {% endfor %}

在视图里也可以有类似于模板里根据名字获取URL的方式,叫做reverse

class Post(models.Model):
    def get_absolute_url(self):
        return reverse("detail", kwargs={"id":self.id})

最后说一下,有时候为了防止域名冲突,我们可以给应用添加命名空间。

给csblog.urls.py的posts条目添加namespace

urlpatterns = [
    url(r'^posts/', include("posts.urls",namespace="posts")),
]

然后,在所有引用posts的URL名字的地方,都必须加上posts:,否则会提示名字找不到

class Post(models.Model):
    def get_absolute_url(self):
        return reverse("posts:detail", kwargs={"id":self.id})