Django url的命名空间 url反向解析

用法一:

一个简单的需求: 在博客的主页的右侧列出所有的文章分类,当点击相应的分类的时候,列出这个分类下的所有文章.

此时,就需要用到url反向解析,Django里面的视图函数命名空间技术.

具体代码实现就是在urls.py中声明app_name:

app_name = 'blog'
之后在url匹配中添加name参数:

url(r'^category/(?P<pk>[0-9]+)/$', views.category, name='category'),
这样可以匹配 category/某个数字 


在html中

<a href="{% url 'blog:category' category.pk %}">
此时通过blog命名空间中的名字为category的匹配项匹配到views下面的cateory函数,并把 category.pk参数传给category函数

category函数的实现为:

def category(request, pk):
    cate = get_object_or_404(Category, pk=pk) #根据主键值取得分类的名字
    post_list = Post.objects.filter(category=cate).order_by('-create_time')
    return render(request, 'blog/index.html', context={'post_list':post_list})
根据从数据库里面取到的值重新渲染index.html模板,拿到该分类的所有文章.

用法二:

在models数据表类中定义reverse方法:

class Post(models.Model):
#标题
title = models.CharField(max_length=70)
... ...
#'blog:detail',意思是 blog 应用下的 name=detail 的函数
    #于是 reverse 函数会去解析这个视图函数对应的 URL,我们这里 detail 对应的规则就是 post/(?P<pk>[0-9]+)/ 这个正则表达式,
    # 而正则表达式部分会被后面传入的参数 pk 替换
    def get_absolute_url(self):
        return reverse('blog:detail', kwargs={'pk': self.pk})

首先index函数会返回从数据库中取到的文章列表对象:

def index(request):
    #order_by 方法对这个返回的 queryset 进行排序。排序依据的字段是 created_time,即文章的创建时间。- 号表示逆序
    post_list = Post.objects.all().order_by('-create_time')
    return render(request, 'blog/index.html', context={'post_list':post_list})

在index.html中

{% for post in post_list %}
<article class="post post-{{ post.pk }}">
    <header class="entry-header">
        <h1 class="entry-title">
            <a href={{ post.get_absolute_url }}>{{ post.title }}</a>
... ...

当点击标题的时候,调用Post类中的get_absolute_url 方法,该方法中的reverse函数反向解析
调用blog命名空间中名字为detail的解析项:

url(r'^post/(?P<pk>[0-9]+)/$', views.detail, name='detail'),
最终会调用views.detail函数
def detail(request, pk):
    post = get_object_or_404(Post, pk = pk) #根据models中reverse函数返回的pk键值查找对应的内容

    post.body = markdown.markdown(post.body,
                                  extensions=[
                                      'markdown.extensions.extra',
                                      'markdown.extensions.codehilite',
                                      'markdown.extensions.toc',
                                  ])
    return render(request, 'blog/detail.html', context={'post':post})

返回文章详细内容的页面,支持markdown语法解析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值