django專案開發實戰——部落格

一隻路過的小碼農cxy發表於2018-08-08

p個大s:

這裡用的是python3.7和Django2.0.假設全都安裝成功= =
然後這個是我做個人網站的一個過程=。=
然後這個也不能算是個教程吧=。=
然後這只是粗糙的記錄=。=
最後,防脫髮用霸王=3=

生成一個完整的django專案

  • 建立Django專案

    django-admin.py startproject MySite

    此時,你會看到這樣的資料夾:
    image_1cjvd08ra1bil15seqb71p312or9.png-6.5kB

  • 執行一下你的專案,看看有沒有成功

    ./manage.py runserver

    終端會顯示這些:
    image_1cjvd8tjj4aq48ihk21n4d1b38m.png-79kB
    有紅字也不要擔心,因為還沒有設定呢!
    接下來去http://127.0.0.1:8000/看一看:
    image_1cjvdb63b1bcl1jnpupct2610j423.png-121.7kB
    成功了!
    ps:如果想要外部機器(同一網路)訪問本機的Django服務的話,要寫成./manage.py runserver 0.0.0.0:9999,並將setting.py中的ALLOWED_HOSTS改為ALLOWED_HOSTS = ['*', ],一定要加逗號

  • 改一些配置
    ps:這裡的順序可能不對。= =

    1. 更改/MySite/MySite/settings.py中的內容
      Django預設的DATABASESsqlite,是這樣的:
      image_1cjvdpm002a81skaf2714pr1f2t2g.png-13.3kB
      這裡我是用的是MySQL資料庫,因此,我要改成這樣:

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'MySite',
              'USER': 'xxx',
              'PASSWORD': 'xxxxx',
              'HOST': '127.0.0.1',
              'PORT': '3306'
          }
      }

      這裡一定要確保資料庫已經存在了。在這之前,需要建立資料庫,像這樣滴:

      create database MySite CHARACTER SET utf8 COLLATE utf8_general_ci;

      還要更改時區語言
      image_1cjveevfspif39o6hm2mnucn3d.png-5.8kB

    2. /MySite/MySite/__init__.py中新增內容

      import pymysql
      pymysql.install_as_MySQLdb()
  • 資料庫遷移
    首先,執行

    ./manage.py makemigrations

    然後,執行

    ./manage.py migrate

    這樣就成功啦~
    image_1cjvfbgkulc0gvt1gl9cu01sgd4a.png-70.9kB

  • 建立超級使用者
    建立超級使用者是用來登陸到admin後臺管理中的
    執行

    ./manage.py createsuperuser

    然後按照提示填寫就好啦~
    ps:一定要先進行資料庫遷移,再建立使用者。否則,會出現image_1cjvfv00s1kuo119k1t8dh581ug84n.png-6.3kB

  • 進入admin看看
    在瀏覽器中輸入http://127.0.0.1:8000/admin,會出現登入頁面,此時會發現全都變成中文了,說明之前的設定生效了。
    image_1cjvg4n791bobtht1smbf1f1u7t54.png-41.6kB
    接下來,就可以用剛剛建立的使用者登陸了,檢視後臺資料了!

專案正式開始

  • 建立app
    執行./manage.py startapp Post,檢視專案結構,如下:
    image_1cjvibkvpei29mk1doucvv12j15h.png-10kB

    完成上步操作後,需要在/MySite/MySite/settings.py中將app新增進去:
    image_1cjvifci91ss01v9l1l1g1m5moo25u.png-14.5kB
    接下來,需要在app資料夾下新增urls.py,用於路由對映:
    image_1cjvilv4o14lf9a9371jkjhcr7o.png-9.4kB
    urls.py中這樣寫:

    app_name = 'Post'   # 這裡是為了url反向解析用
    
    urlpatterns = [
        # 這裡放對映的view
    ]

    同時,在/MySite/MySite/urls.py中需要新增對Post.urls的對映:

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path(r'', include('Post.urls')),
    ]
  • 建立模型
    在app下的models.py建立自己的模型就可以啦~

    from django.db import models
    
    class Category(models.Model):
        """分類"""
        name = models.CharField(max_length=100)
    
    
    class Tag(models.Model):
        """標籤"""
        name = models.CharField(max_length=100)
    
    
    class Post(models.Model):
        """文章"""
        title = models.CharField(max_length=100)
        body = models.TextField()
        created_time = models.DateTimeField()
        modified_time = models.DateTimeField()
        excerpt = models.CharField(max_length=200, blank=True)  # 文章摘要,可為空
        category = models.ForeignKey(Category, on_delete=True)  # ForeignKey表示1對多(多個post對應1個category)
        tags = models.ManyToManyField(Tag, blank=True)
        views = models.PositiveIntegerField(default=0)  # 閱讀量

    然後一定不要忘記再進行資料庫遷移啊!!

  • 前端模版
    這裡的前端模板使用的是模板之家的
    連結��:http://www.cssmoban.com/tags.asp?n=html5

    首先建立templates目錄,結構如下:
    image_1cjvlp6q840k17eg1cubd8i1qpi8i.png-12.8kB
    此時,需要在setting.py中新增關於模板的配置:
    image_1cjvls24ohf91gngccsuk5ce8v.png-39.8kB

    接下來是static目錄,結構如下:
    image_1cjvlvc96ir9hk4ubn1jk73uq9c.png-9.5kB
    顯而易見,這裡放的是一些css、js檔案等

  • index檢視
    首先,在Post/views.py中實現index方法:

    def index(request):
        """
        主頁
        :param request:
        :return:
        """
        return render(request=request, template_name='Post/index.html')

    request為請求物件;
    template_name為渲染的前端頁面的路徑字串(相對templates目錄)

    然後,在Post/urls.py中進行路由對映:

    urlpatterns = [
        url(r'^$', views.index, name="index"),
    ]

    注意:如果你主頁的url是空,正則必須寫成^$

    最後,一定要要修改靜態頁面中引用的路徑。
    對於Django來說,可以使用static標籤。
    在頁面開頭引入{% load static %},這個對應的配置資訊是image_1ck6k15rg1j1lfei3j1aoepvha9.png-2.7kB
    並將頁面中的路徑改為image_1ck6k35as1gm97pr1gng1ch41ns7am.png-4.5kB
    ps:對於css或者js中的引用也不要忘了改!

    執行一下。
    image_1ck6k74sv5p3212h1osclqub3.png-422.3kB
    搞定!

  • 向前端渲染及分頁
    首先,更改index()

    from django.shortcuts import render
    from django.core.paginator import Paginator
    from .models import Post
    
    
    def index(request):
        """
        主頁
        :param request:
        :return:
        """
    
        post = Post.objects.all()
    
        limit = 3
        paginator = Paginator(post, limit)
        page = request.GET.get('page', 1)
    
        result = paginator.page(page)
        context = {
            "post_list": result,
            "page": page
        }
        return render(request=request, template_name='Post/index.html', context=context)

    然後修改index.html
    image_1ck6ueleqhgg1ml215qg8461hpkbg.png-122kB

    執行看一下
    image_1ck6uhi34mt1nqi1a3i46p204bt.png-173.5kB
    搞定!

  • 更改index.html中的所有跳轉連結
    在這裡,我用的是url的反向解析。這樣可以減輕後期維護成本。因此,就需要在urls.py中新增如下資訊:
    image_1ck6vajq31hn72jkr4hjpe1dt1ca.png-11.1kB

    image_1ck6vb9cieha182n1eg12rt7qfcn.png-7.8kB
    在html中修改成如下:
    image_1ck6vcgaqlpe8dqsf8qnn17rndk.png-3.5kB

  • 部落格文章頁面
    別忘了改跳轉連結!!!!
    文章詳情頁和主頁大體結構是相似的,因此,這裡使用了模版繼承。
    在基類模版裡,使用這個,將子類模版需要填充的位置佔位
    image_1ck99cgjpsqtjq41hnk148j1ak9.png-4.6kB
    然後在子類别範本中,使用相同的標籤將填充的內容進行包裹
    最後,不要忘了在子類别範本中再寫上{% extends 'Post/base.html' %}{% load static %}

    Post/urls.py中新增詳情頁的url:

    url(r'^detail/post-(?P<pk>\d+)$', views.detail, name="detail"),

    並新增detail檢視

    def detail(request, pk):
    """
    :param request: 
    :param pk: 接收到的文章的主鍵id
    :return: 
    """
    return render(request, template_name='Post/blog.html', )

    執行看一下吧!
    image_1ck99kovo16t218tb11lo19k441mm.png-257kB
    搞定!
    繼續在檢視中新增內容,將假資料改為真實的文章資料
    對於多對多的關係來說,可以寫成這樣:
    image_1ck9hp2bkhnqamtcnbbm415813.png-10.1kB
    看一看效果吧!
    image_1ck9i8vcll104c16qd1i9r2k01g.png-264.3kB

    **接下來就是讓我可以上傳markdown格式的文字了!
    這個暫時先不解決了= =,小本本記下來**

  • 新增分類欄
    這裡使用自定義模版標籤!
    首先,在app資料夾下,建立templatetags資料夾,然後建立一個py檔案,裡面定義模版標籤,目錄是這樣滴:
    image_1ckc3ee0n117f10is15k8idd402d.png-9.9kB

    然後定義一個分類目錄的標籤:

    from django import template
    from ..models import Category
    
    register = template.Library()
    
    @register.simple_tag
    def get_categories():
        """
        分類目錄標籤
        :return:
        """
        return Category.objects.all()

    在前端引用自定義標籤時,一定要開頭載入自定義的模版標籤所在的py檔案,{% load simple_tags %},然後再使用:

    {% get_categories as category_list %}
    {% for category in category_list %}
        <li><a href="#">{{ category.name }}</a></li>
    {% endfor %}

    看一下效果吧!
    企業微信截圖_f1e71885-52fc-43e6-b722-a51dc80c8934.png-364.8kB
    搞定!

  • 評論功能
    評論功能新建一個app

    ./manage.py startapp comment 

    不要忘了把它註冊到django中
    image_1ckc6rca21j8d73ogvq16a01cl01e.png-15.2kB

    建立模型:

    from django.db import models
    
    class Comment(models.Model):
        name = models.CharField(max_length=20)
        email = models.EmailField(max_length=50)
        website = models.URLField(blank=True)
        text = models.TextField()
        created_time = models.DateTimeField(auto_now_add=True)
    
        post = models.ForeignKey('Post.Post', on_delete=True)  # 一篇文章有多個評論

    不要忘了註冊到admin中啊!

    admin.site.register(Comment)

    最重要的一步。資料庫遷移啊!!!

    這裡要實現的是點選submit按鈕,會提交評論
    comment/views.py中新增檢視:

    from django.shortcuts import render, redirect
    from .models import Comment
    from Post.models import Post
    from django.urls import reverse
    
    
    def submit_comment(request, pk):
        """
        處理提交的評論
        :param request:
        :return:
        """
        post = request.POST
        comment = Comment()
        comment.name = post.get("name")
        comment.email = post.get('email')
        comment.website = post.get('website')
        comment.text = post.get('message')
        comment.post = Post.objects.get(id=pk)
        comment.save()
    
        return redirect(reverse('Post:detail', kwargs={"pk": pk}))

    更改前端頁面中的評論部分:
    image_1ckcba269rui1u8a8rt1chqulf2r.png-37.9kB

    comment/urls.py中新增對映:
    image_1ckcc3v5apog1quqljj7lrrh21p.png-13.1kB
    試一下吧!
    image_1ckcc59nn17vv1dqq1lot1lak8tk26.png-24.9kB
    搞定!

    後面再完善一下。搞成可以回覆的啵!小本本記下來~

  • 最新評論
    這個也寫成自定義標籤啵。

    @register.simple_tag
    def get_latest_comment():
        """
        獲取最新評論
        :return:
        """
        comment_list = Comment.objects.all()[:5].only('post', 'text')   # 只獲取特定欄位
        return comment_list

    image_1ckceclnl10r41ocn18rlu2mpfc2j.png-17.4kB

    看一下效果
    image_1ckcef75i1ie51q421seb1rcu1lmm30.png-20.2kB
    搞定!

  • 閱讀量
    Post/models.py中新增:
    image_1ckcf0alj1l1u12a450avgf14323d.png-71.1kB

    Post/views.py中新增:
    image_1ckcf1coerbg1j2lroe2l91q9b3q.png-48.6kB

    在前端頁面新增:
    image_1ckcf2edjfd11i6qg8e1vq51pfo47.png-4.3kB

    搞定!
    image_1ckcf3k481u62unqtur1iis10ne5k.png-7.5kB

好啦~到這裡部落格基本成型了。就是不好看= =。然後後面繼續完善。小本本記下來。

相關文章