• [python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情


    回顾一下开发流程:配置url, 编写视图函数,编写对应模板

    1. 配置URL
        • 首页视图匹配的 URL 去掉域名后,是一个空的字符串。每篇文章的详情有着不同的 URL,因此可以设计文章详情页面URl:<网站域名>/post/文章ID/ 时.下面依照这个规则来绑定 URL 和视图:
          # coding=utf8
          
          
          from django.conf.urls import url
          
          from .import views
          
          app_name = 'blog' urlpatterns
          = [ url(r"^$", views.index, name="index"), url(r'^post/(?P<pk>[0-9]+/$)', views.detail, name='detal'), ]

           当用户访问 post/255/ 时, (?P<pk>[0-9]+) 会匹配255,并且传递关键字参数pk=255,给视图函数即:detail(request, pk=255)?P<pk> 是 python 正则表达式的一个占位格式,表示其后匹配的内容将被存入键为 pk 的字典中。

        • 还添加了app_name = 'blog',告诉 Django 这个 urls.py 模块是属于 blog 应用的,这种技术叫做视图函数命名空间。区分不同应用中同名的视图函数
        • 给detail的url命名为detail
    2. 编写视图函数
      • # coding=utf8
        
        
        from django.shortcuts import render, get_object_or_404
        from .models import Post
        
        
        # Create your views here.
        def index(request):
            post_list = Post.objects.all().order_by('-create_time')
            return render(request, 'blog/index.html', context={'post_list': post_list})
        
        
        def detail(request):
            # get_object_or_404当传入的pk对应的post数据存在时,就会返回post数据,否则返回404
            post = get_object_or_404(Post, pk=pk)
            return render(request, 'blog/detail.html', context={'post': post})
    3. 编写blog/detail.html
      • 先修改Index.html,让点击标题和继续阅读可以进入详情页面,即给标题和继续阅读添加一个超链接
                    {% for post in post_list %}
                        <article class="post post-{{ post.pk }}">
                            <header class="entry-header">
                                <h1 class="entry-title">
                                    <!-- <a href="single.html">{{ post.title }}</a> -->
                                    <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
                                </h1>
                                <div class="entry-meta">
                                    <span class="post-category"><a href="#">{{ post.category.name }}</a></span>
                                    <span class="post-date"><a href="#"><time class="entry-date"
                                                                              datetime="{{ post.create_time }}">2017年5月11日</time></a></span>
                                    <span class="post-author"><a href="#">{{ post.author }}</a></span>
                                    <span class="comments-link"><a href="#">4 评论</a></span>
                                    <span class="views-count"><a href="#">588 阅读</a></span>
                                </div>
                            </header>
                            <div class="entry-content clearfix">
                                <p>{{ post.excerpt }}</p>
                                <div class="read-more cl-effect-14">
                                    <!-- <a href="#" class="more-link">继续阅读 <span class="meta-nav">→</span></a> -->
                                    <a href="{{ post.get_absolute_url }}" class="more-link">继续阅读 <span class="meta-nav"></span></a>
                                </div>
                            </div>
                        </article>
                        {% empty %}
                            <div class="no-post">暂时还没有发布的文章!</div>
                        {% endfor %}
        View Code
      • 我们看到在blog/index.html有一个函数post.get_absolute_ur函数,函数属于post一个方法,得到文章详情页面的url . 因此在Post添加这个方法:
            # 自定义get_absolute_url方法,获取详情页面的绝对url
            # 需要 from django.urls import reverse
            def get_absolute_url(self):
                return reverse('blog:detail', kwargs={'pk': self.pk})
      • reverse('blog:detail', kwargs={'pk': self.pk})理解:请点我查看理解
    4. 重新插入数据
      >>> User.objects.all()
      <QuerySet [<User: myuser>]>
      >>> Tag.objects.all()
      <QuerySet [<Tag: tag_test>]>
      >>> Category.objects.all()
      <QuerySet [<Category: categroy_test>]>
      >>> user = User.objects.get(username='myuser')
      >>> t= Tag.objects.get(name='tag_test')
      >>> c = Category.objects.get(name='categroy_test')
      >>> p = Post(title='title_test', body='body_test_liuzhipeng', create_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
      >>> p.save()
      >>>
    5. 如果出现错误:
      NoReverseMatch at /
      Reverse for 'detail' with arguments '()' and keyword arguments '{'pk_id': 2}' not found. 1 pattern(s) tried:大部分是两个urls.py的错误,请认真排查
  • 相关阅读:
    怎么样通过API函数获取tooltip的内容(请高手帮忙)
    Ajax控件之Accordion控件学习
    C#中结构与类的区别
    C# ref and out 区别
    java 将PDF文件的首页提取为图片
    围住浮动元素(消除浮动)的三种方法
    myeclipse unable to install breakpoint
    C#调用C++编写的COM DLL
    高手教你玩53kf在线客服的指定客服功能
    让IIS支持Flv的详细设置方法
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7344024.html
Copyright © 2020-2023  润新知