博客五部曲之一 - 简单博客
1375 浏览 5 years, 11 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})