Django学习笔记

去年的事情特别多,也没有什么时间充电学习。今年目测轻松一点,年初本来计划就好好休息一下,结果一晃2017就度过了一半。人轻松一点的时候就可以放松思想去思考很多事情,思来想去,发现还是要搞一点事情。遂决定学学python,这几天看着教程敲了敲代码,记录一下☺
代码地址:https://github.com/huibaoer/simpleBlog

安装django

登陆官网https://www.djangoproject.com/ 到下载页面

  • 方法1 若安装了pip,使用官网推荐方式pip安装
  • 方法2 源码安装,页面右侧 latest release:下载最新的django。解压后在django根目录执行命令:python3 setup.py install

创建django工程

  • 安装好django后终端中会有django-admin命令,跳转到准备创建工程的目录下,执行命令 django-admin startproject myblog
  • 创建好工程后可以启动服务,查看效果,跳转到工程根目录(manage.py的同级目录)执行命令:python3 manage.py runserver

为创建好的工程添加应用

  • 跳转到工程根目录执行命令:python3 manage.py startapp blog
  • 将新添加的应用添加到工程设置中
  INSTALLED_APPS = [
      'django.contrib.admin',
      'django.contrib.auth',
      'django.contrib.contenttypes',
      'django.contrib.sessions',
      'django.contrib.messages',
      'django.contrib.staticfiles',
      'blog',
  ]

添加第一个响应

  • views.py文件中导入类 from django.http import HttpResponse
  • 在views中每个响应都是一个函数,创建响应的函数:
  def index(request):
      return HttpResponse("Hello World!")
  • 配置url,在urls.py中添加配置:
  import blog.views

  urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^index/', blog.views.index),
  ]
  • 命令行执行命令python3 manage.py runserver,查看经典的 ‘Hello World!’ 吧

为blog应用添加自己的urls.py配置文件

  • 在根urls.py中引入include
  from django.conf.urls import url, include
  from django.contrib import admin

  urlpatterns = [
      url(r'^admin/', admin.site.urls),
      url(r'^blog/', include('blog.urls')),
  ]
  • 在blog应用下新建urls.py文件,并添加如下代码
  from django.conf.urls import url
  from . import views

  urlpatterns = [
      url(r'^index/', blog.views.index),
  ]

为blog添加Templates

  • 在blog根目录下创建Templates目录,在Templates目录下创建blog同名目录(防止同名文件)
  • blog目录下创建index.html文件
  <!DOCTYPE html>
  <html lang="en">
  <head>
      <meta charset="UTF-8">
      <title>Title</title>
  </head>
  <body>
  <h1>hello,blog</h1>
  </body>
  </html>
  • 在views.py中返回render(),即可在浏览器中看到效果
  def index(request):
      return render(request, 'blog/index.html')
  • 使用render()传递参数
    • render()中添加字典参数
      def index(request):
        return render(request, 'blog/index.html', {'text': 'hello,blog,hahaha'})
    
    • index.html中使用render()传递过来的参数
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>{{text}}</h1>
      </body>
      </html>
    

Models

  • 在应用根目录下models.py文件下引入models模块,创建类,继承models.Model,该类即是一张表,在该类中创建数据表的字段
  from django.db import models


  class Article(models.Model):
      title = models.CharField(max_length=32, default='Title')
      content = models.TextField(null=True)
  • 将数据模型映射成数据表
    命令行中进入manage.py同级目录,执行 python3 manage.py makemigrations app(可选);再执行 python3 manage.py migrate

  • 查看db.sqlite3数据库
    可以使用数据库可视化工具查看生成的数据库内容,如navicat。blog_article就是models.py文件下创建的Article类生成的表,在blog_article表中添加一条记录,用于后续查看

  • 页面呈现model数据

    • blog下的views.py下返回Article对象,引入models,获取键值为1的对象并返回
        from django.shortcuts import render
        from django.http import HttpResponse
        from . import models
    
        def index(request):
            article = models.Article.objects.get(pk=1)
            return render(request, 'blog/index.html', {'article': article})
    
    • 修改前端,显示article对象返回的数据
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>{{ article.title }}</h1>
      <h2>{{ article.content }}</h2>
      </body>
      </html>
    

admin

  • 配置admin
    • 创建用户 python3 manage.py createsuperuser 创建超级用户
    • 启动服务,登录admin,查看效果
    • 将admin后台修改为中文,在settings.py中修改 LANGUAGE_CODE = 'zh_Hans'
  • 配置应用,才能admin下管理应用
    • 在应用下admin.py中引入自身的models模块(或者里面的模型类)
    • 编辑admin.py:admin.site.register(models.Article)
      from django.contrib import admin
      from . import models
    
      admin.site.register(models.Article)
    
    • 登录admin,可以对数据进行增删改查等操作。同时可以使用数据库视图化工具实时查看数据库中的数据变化
    • 修改数据默认显示的名称,在Article类下添加一个方法,python3使用str(self),python2使用_unicode(self)
      class Article(models.Model):
        title = models.CharField(max_length=32, default='Title')
        content = models.TextField(null=True)
    
        def __str__(self):
            return self.title
    

myblog完善

  • 博客页面设计
    • 博客主页面

      • 文章标题列表,超链接
      • 发表博客按钮(超链接)
        后台代码:
        def index(request):
          articles = models.Article.objects.all()
          return render(request, 'blog/index.html', {'articles': articles})
      

      前端代码:

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
      
        <h1>
            <a href="">新文章</a>
        </h1>
        {% for article in articles %}
            <a href="">{{ article.title }}</a>
            <br/>
        {% endfor %}
        </body>
        </html>
      
    • 博客文章内容页面

      • 标题
      • 文章内容
      • 修改文章按钮(超链接)
        首先在Templates目录下,添加article_page.html文件
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        <h1>{{ article.title }}</h1>>
        <br/>
        <h3>{{ article.content }}</h3>>
        <br/><br/>
        <a href="">修改文章</a>
        </body>
        </html>
      

      在views.py下添加article_page函数

        def article_page(request, article_id):
          article = models.Article.objects.get(pk=article_id)
          return render(request, 'blog/article_page.html', {'article': article})
      

      最后,urls.py中配置url,并传递article_id参数(使用主键id作为article_id),注意传递article_id参数的正则表达式的写法

        urlpatterns = [
            url(r'index/', views.index),
            url(r'article/(?P<article_id>[0-9]+)', views.article_page),
        ]
      

      添加超链接,实现点击列表页面中文章标题后跳转到指定文章的效果,django的Templates中超链接的写法 href="{% url 'app_namespace:url_name' param %}"
      在根urls.py下,为blog url添加namespace

        urlpatterns = [
          url(r'^admin/', admin.site.urls),
          url(r'^blog/', include('blog.urls', namespace='blog')),
        ]
      

      在blog的urls.py下,为article url添加name

        urlpatterns = [
            url(r'index/', views.index),
            url(r'article/(?P<article_id>[0-9]+)', views.article_page, name='article_page'),
        ]
      

      在index.html中添加超链接

        <body>
      
        <h1>
            <a href="">新文章</a>
        </h1>
        {% for article in articles %}
            <a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
            <br/>
        {% endfor %}
        </body>
      
    • 博客撰写页面

      • 标题编辑栏
      • 文章内容编辑区域
      • 提交按钮
        首先创建edit_page.html文件
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
        <form action="{% url 'blog:edit_action' %}" method="post">{% csrf_token %}
            <label>文章标题
                <input type="text" name="title"/>
            </label>
            <br/>
            <label>文章内容
                <input type="text" name="content">
            </label>
            <br/>
            <input type="submit" value="提交">
        </form>
      
        </body>
        </html>
      

      在views.py中添加编辑页面和提交按钮的函数

        def edit_page(request):
          return render(request, 'blog/edit_page.html')
      
        def edit_action(request):
            title = request.POST.get('title', 'TITLE')
            content = request.POST.get('content', 'CONTENT')
            models.Article.objects.create(title=title, content=content)
            articles = models.Article.objects.all()
            return render(request, 'blog/index.html', {'articles': articles})
      

      在urls.py中添加相关url

        urlpatterns = [
            url(r'index/$', views.index),
            url(r'article/(?P<article_id>[0-9]+)/$', views.article_page, name='article_page'),
            url(r'edit/$', views.edit_page, name='edit_page'),
            url(r'edit/action/$', views.edit_action, name='edit_action'),
        ]
      

      最后在index.html文件中添加‘新建文章’超链接

        <a href="{% url 'blog:edit_page' %}">新文章</a>
      
      • 文章撰写页面添加修改文章功能
        上面的文章撰写页面实现了,点击index页面的新文章按钮,跳转到文章撰写页面,然后创建新文章。但是博客还需要有修改已有文章的功能,下面完善文章撰写页面,让其拥有修改文章的功能
        思路如下:跳转到文章撰写页面的时候需要传递一个article_id作为参数,当新建文章时,article_id为0;当修改文章时,article_id为该文章的键值id。

        • views.py下,为edit_page,添加article_id参数
          def edit_page(request, article_id):
            if str(article_id) == '0':
                return render(request, 'blog/edit_page.html')
            article = models.Article.objects.get(pk=article_id)
            return  render(request, 'blog/edit_page.html', {'article': article})
        
        • 配置edit_page函数的url,添加参数article_id
          url(r'edit/(?P<article_id>[0-9]+)/$', views.edit_page, name='edit_page'),
        
        • 编辑article_page.html的修改文章超链接,传递参数article_id
          <a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
        
        • 编辑index.html的新建文章超链接,传递参数article_id为0
          <a href="{% url 'blog:edit_page' 0 %}">新文章</a>  
        
        • 在edit_page.html中根据article_id的值区分是新建文章还是修改文章,修改文章需要将文章的内容填写在编辑框内
          <form action="{% url 'blog:edit_action' %}" method="post">
            {% csrf_token %}
            {% if article %}
                <label>文章标题
                    <input type="text" name="title" value="{{ article.title }}"/>
                </label>
                <br/>
                <label>文章内容
                    <input type="text" name="content" value="{{ article.content }}"/>
                </label>
            {% else %}
                <label>文章标题
                    <input type="text" name="title" "/>
                </label>
                <br/>
                <label>文章内容
                    <input type="text" name="content" "/>
                </label>
            {% endif %}
            <br/>
            <input type="submit" value="提交">
          </form>
        
        • 编辑页面点击提交按钮,是新建文章的话就创建新的数据model;是修改文章的话就修改本编文章的数据model。
          • 方法1,同样使用修改url,添加article_id参数的方式判断
          • 方法2,不修改url。通过隐藏的input标签传递article_id
            下面使用方法2来实现,在edit_page.html中添加隐藏的input标签。
          <form action="{% url 'blog:edit_action' %}" method="post">
            {% csrf_token %}
            {% if article %}
                <input type="hidden" name="article_id" value="{{ article.id }}">
                <label>文章标题
                    <input type="text" name="title" value="{{ article.title }}"/>
                </label>
                <br/>
                <label>文章内容
                    <input type="text" name="content" value="{{ article.content }}"/>
                </label>
            {% else %}
                <input type="hidden" name="article_id" value="0">
                <label>文章标题
                    <input type="text" name="title" "/>
                </label>
                <br/>
                <label>文章内容
                    <input type="text" name="content" "/>
                </label>
            {% endif %}
            <br/>
            <input type="submit" value="提交">
          </form>
        

        下面修改views.py的提交按钮的响应函数

          def edit_action(request):
            title = request.POST.get('title', 'TITLE')
            content = request.POST.get('content', 'CONTENT')
            article_id = request.POST.get('article_id', '0')
        
            if article_id == '0':
                models.Article.objects.create(title=title, content=content)
                articles = models.Article.objects.all()
                return render(request, 'blog/index.html', {'articles': articles})
        
            article = models.Article.objects.get(pk=article_id)
            article.title = title
            article.content = content
            article.save()
            return render(request, 'blog/article_page.html', {'article': article})
        

小技巧

  • 过滤器
    {{ value | filter }},例如:{{ article_id | default:'0' }}表示article_id的缺省值为0
  • Django shell
    python3 manage.py shell 启动Django shell,可以进行调试
  • admin
    配置admin,更多可参考Django文档
  class ArticleAdmin(admin.ModelAdmin):
      list_display = ('title', 'content')

  admin.site.register(models.Article, ArticleAdmin)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容