• 三、显示博客信息


    *******SyntaxError: invalid character in identifier错误,是因为代码里有中文的空格,改为英文空格,切记********

    1、显示文章标题

     在交互模式中练习一下对数据库进行增、删、改、查的操作:

    >python manage.py shell

    >>> from django.contrib.auth.models import User
    >>> from blog.models import BlogArticles

    这里使用 python manage.py shell 的方式进入到交互模式中 , 而不是用读者在学习基础知识时常用的 Python 指令, 因为用这样的方式已经将 Django 环境引入到了当 前交互模式中 。后面两行语句分别引入了两个对象, User 是 Django 默认的, BlogArticles 是我们在../blog/models.py 中写的。

    >>> user = User.objects.get(username="admin")

    >>> blogs = BlogArticles.objects.all()----------查询结果被称为QuerySet

    >>> for blog in blogs:
    ...        print(blog.title)

    ... 

    写一个函数,专门用来读取文章标题,这个函数通常被写 在../blog/views.py 文件中:

    from django.shortcuts import render

    # Create your views here.

    from .models import BlogArticles

    def blog_title(request):
      blogs = BlogArticles.objects.all()
      return render(request,"blog/titles.html",{"blogs":blogs})

          在 render()中出现的 blog/titles.html 就是标题列表的前端展示页面一一-被称为“模板"。 在每 一个应用中都可以有一个专门的模板目录,现在我们进入应用 blog 的目录./blog,建立一个子目录 templates,名称和位置必须如此,再按照如下方式建立有关文件和子目录。 

       templates 目录是 Django 默认的存放本应用所需模板的目录,如果不用自定义的方式指定模板位置, Django 会在运行时自动来这里查找 render()函数中所指定的模板文件。

            在模板目录中,有一个 base.html 文件,这个文件是将所有模板中公共的部分抽取出来,在 其他文件中只需要编写个性部分的代码。也就是说, 在 Django 的模板文件中,是可以有“继承” 功能的。在本项目中,就这样来编写 base.html。

    <!DOCTYPE html>
    <html lang="zh-cn">
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="http://necolas.github.io/normalize.css/">
    <link rel="stylesheet" href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css">
    </head>
    <body>
    <div class="container">
    {% block content %}
    {% endblock %}
    </div>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js">
    </script>
    <script src="http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.min.js">
    </script>
    </body>
    </html>

    这就是一个基础模板。下面编写与标题列表相对应的模板, 即./templates/blog/titles.html 文
    件。

    {% extends "base.html" %}
    {% block title %}blog titles{% endblock %}
    {% block content %}
    <div class="row text-center vertical-middle-sm">
    <h1>我的博客</h1>
    </div>
    <div class="row">
    <div class="col-xs-12 col-md-8">
    <ul>
    {% for blog in blogs %}
    <li>{{ blog.title }}</li>
    {% endfor %}
    </ul>
    </div>
    <div class="col-xs-6 col-md-4">
    <h2>广告</h2>
    <p>熊猫www.xiongmao.com</p>
    <img width="200px" src="https://img.zcool.cn/community/015da9554971170000019ae9f43459.jpg@2o.jpg">
    </div>
    </div>
    {% endblock %}

    函数和模板都编写好之后,要想通过网页访问,还需要进 行 URL 配置。首先要配置./mysite/urls.py, 在这个文件中配置本项目的各个应用。

    from django.contrib import admin
    from django.conf.urls import url,include
    
    #urlpatterns = [
    #    path('admin/', admin.site.urls),
    #]
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^blog/', include('blog.urls', namespace='blog', app_name='blog')),
    ]

    地址栏中输入了类似 http://localhost:8000/blog的地址,通过这里的 URL 配置, 将此请求转向到 blog 应用的 urls.py, 即 ./blog/urls.py。 

    from django.conf.urls import url
    from . import views

    #app_name = 'blog'
    urlpatterns = [
    url(r'^$', views.blog_title, name="blog_title"),
    ]

    2、查看文章内容

    titles.html 中修改如下

    {% for blog in blogs %}
        <li><a href="{{blog.id}}">{{ blog.title }}</a></li>
    {% endfor %}

    编辑./blog/views.py,增加响应查看文章详情请求的函数 blog_ article()

    from django.shortcuts import render, get_object_or_404
    
    # Create your views here.
    
    from .models import BlogArticles
    
    def blog_title(request):
        blogs = BlogArticles.objects.all()
        return render(request,"blog/titles.html",{"blogs":blogs})
    
    def blog_article(request, article_id):
        #article = BlogArticles.objects.get(id=article_id)
        article = get_object_or_404(BlogArticles,id=article_id)
        pub = article.publish
        return render(request, "blog/content.html", {"article":article, "publish":pub})

    创建./templates/blog/content.html 文件

    {% extends "base.html" %}
    {% block title %}blog article{% endblock %}
    {% block content %}
    <div class="row text-center vertical-middle-sm">
        <h1>{{article.title}}</h1>
    </div>
    <div class="row">
        <div class="col-xs-12 col-md-8">
            <p class="text-center">
                <span>{{article.author.username}}</span>
                <span style="margin-left:20px">{{publish}}</span>
            </p>
            <div>{{article.body}}</div>
        </div>
        <div class="col-xs-6 col-md-4">
            <h2>广告内容</h2>
            <p>看看这个标题里的内容www.houzi.com</p>
            <img width="200px" src="http://p0.qhimgs4.com/t0153895ece3ec299e6.jpg">
        </div>
    </div>
    {% endblock %}

    接着配置 URL,因为还是针对 blog 这个应用而言,所以不需要修改/mysite/urls.py, 只需 要在./blog/urls.py 文件中增加新的 URL 路径。

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^$', views.blog_title, name="blog_title"),
        url(r'(?P<article_id>d)/$', views.blog_article, name="blog_detail"),
    ]

    修改./blog/views.py 中的 blog_article()函数,对异常请求进行处理。

    from django.shortcuts import render, get_object_or_404
    
    # Create your views here.
    
    from .models import BlogArticles
    
    def blog_title(request):
        blogs = BlogArticles.objects.all()
        return render(request,"blog/titles.html",{"blogs":blogs})
    
    def blog_article(request, article_id):
        #article = BlogArticles.objects.get(id=article_id)
        article = get_object_or_404(BlogArticles,id=article_id)
        pub = article.publish
        return render(request, "blog/content.html", {"article":article, "publish":pub})

     3、知识点

    Django的MTV

     M:模型(Model),即数据存取层

    T:模板(Template),即表现层

    v:视图(Views),即业务逻辑层

    Django 的几个核心理念:

      更 Python 化。

      DRY。这是很重要的原则,即 Don’t repeat yourself (不要重复自己)。

      松耦合与灵活。

      快速开发。

  • 相关阅读:
    define的用法
    MySQL索引使用方法和性能优化
    自己写的一个Js小插件
    .net处理JSON简明教程
    史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~
    Python面向对象之-反射
    Python内置函数之classmetho staticmethod
    Python内置函数之-property
    python面向对象三大特性-多态
    python面向对象三大特性之封装
  • 原文地址:https://www.cnblogs.com/tuobei/p/9903542.html
Copyright © 2020-2023  润新知