技术交流QQ群:1027579432,欢迎你的加入!

本教程来源于B站杨仕航Django2.0开发视频教程,如需转载,必须注明来源!

1.查看文章页面

  • 如何通过统一的一个处理方法获取每一篇文章?解决方法:利用文章的唯一标识
  • 具体实现:打开article文件夹下的migrations/0001_initial.py,我们可以看到区别每篇文章的字段是id。因此,在article文件夹下的views.py文件中定义视图文件,如下所示:
    from django.http import HttpResponse
    # Create your views here.
    
    
    def article_detail(request, article_id):
        return HttpResponse('文章id: %s' % article_id)
  • 在mysite文件夹下的urls.py文件中添加每篇文章的路由地址,如下所示:
    from article.views import article_detail
    
    urlpatterns = [
        path('article/<int:article_id>', article_detail, name="article_detail"),
    ]

2.objects

  • 模型的objects是获取或操作模型的对象,具体的方法如下:
    Article.objects.get(条件)
    Article.objects.all()
    Article.objects.filter(条件)
  • 在article文件夹下的views.py文件中写入需要在前端页面上展示的字段,如下所示:
    from django.shortcuts import render
    from django.http import HttpResponse, Http404
    from .models import Article
    # Create your views here.
    
    
    def article_detail(request, article_id):
        try:
            article = Article.objects.get(id=article_id)
        except Article.DoesNotExist:
            raise Http404('Not Exist')
    
        return HttpResponse('<h2>文章标题: %s</h2> <br /> 文章内容: %s ' % (article.title, article.content))

3.使用模板

  • 使用模板的目的:前端页面和后端代码分离,减少耦合性。优化上一步中article文件夹下的views.py文件前后端代码的耦合性。
  • 具体步骤如下:
    • 在article文件夹下创建templates文件夹,里面存放前端页面所需要的html文件;
    • 在templates文件夹下创建article_detail.html文件,然后对其进行编辑;
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Document</title>
      </head>
      <body>
          <h2>{{ article_obj.title }}</h2>
          <hr>
          <p>{{ article_obj.content }}</p>
      </body>
      </html>
    • 同时,对article文件夹下的views.py文件中代码进行优化,优化的结果是:
      from django.shortcuts import render_to_response, get_object_or_404
      from .models import Article
      # Create your views here.
      
      
      def article_detail(request, article_id):
          article = get_object_or_404(Article, pk=article_id)
          context = {}
          context['article_obj'] = article
          return render_to_response('article_detail.html', context)

4.获取文章列表

文章列表.png
  • 在article文件夹下的views.py文件中添加如下代码,实现获取文章列表的功能。
    def article_list(request):
        articles = Article.objects.all()
        context = {}
        context['articles'] = articles
        return render_to_response('article_list.html', context)
  • 在templates文件夹下创建article_detail.html文件,然后对其进行编辑;
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <!-- {% 这是模板标签 %} -->
        {% for article in articles%}
            <a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a>
        {% endfor %}
    </body>
    </html>
  • 在mysite文件夹下的urls.py文件中添加文章列表article_list的路由地址,如下所示:
    from article.views import article_detail, article_list
    urlpatterns = [
        path('admin/', admin.site.urls),  # 根路由(后台管理网址):www.baidu.com/admin/
        path('', views.index),   # www.baidu.com
        path('article/<int:article_id>', article_detail, name="article_detail"),
        path('article/', article_list, name="article_list"),
    ]
  • 打开浏览器,输入网址http://localhost:8000/article/,注意:此url中并没有指定哪一篇文章的article_id就可以获得所有的文章信息,如下所示:
    文章列表前端页面.png

5.总urls包含app的urls

总urls包含app的urls.png
  • 打开mysite文件夹下的全局路由文件urls.py,将如下代码剪切到article文件夹下的urls.py(如果没有该文件,需手动新建此文件),
    # localhost:8000/article/1
    path('<int:article_id>', article_detail, name="article_detail"),
    # localhost:8000/article/
    path('', article_list, name="article_list"),
  • 对article文件夹下新建的urls.py文件进行编辑,添加如下内容:
    from django.urls import path
    from .import views
    
    urlpatterns = [
        path('article/<int:article_id>', views.article_detail, name="article_detail"),
        path('article/', views.article_list, name="article_list"),
    
    ]
  • 接着,打开mysite文件夹下的全局路由文件urls.py,在当中引用article这个app的路由文件,添加如下内容:
    from django.urls import path, include
    
    urlpatterns = [
        # .....
        path('article/', include('article.urls')),
    ]