1. 程式人生 > 實用技巧 >Django2.2基本應用結構以及基本模板

Django2.2基本應用結構以及基本模板


第三節:Django基本應用結構
主要解決問題就是為了使用同一個模板處理不同任務,像顯示文章的位置其實就標題和內容不一樣其他大概都是一樣的,因此對於這種基本上相同的任務,我們可以建立一
功能app,對於這種功能設計模板,方便管理、應用

1. 在專案中建立Django app
進入manage.py檔案所在你目錄,執行命令:python manage.py startapp <app名稱>
成功就可以看到多出了一個<app名稱>資料夾

結構圖
<app名稱>資料夾
<migration>資料夾
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
注意這個是原始結構圖,後面會根據需要增加例如urls.py、templates等檔案,或者是由於一些自動的命令配置變化的檔案

2. model模型
設計app模板,個人理解像是設定這個app的資料樣式

model.py內容:
from django.db import models

# Create your models here.
class Article(models.Model):
# 下面兩個使用的都是Django裡面的欄位型別
title = models.CharField(max_length=30) # 標題欄位,設定欄位長度限制
content = models.TextField() # 文字欄位
其中按照需要設定了標題、文字內容兩個格式
在後面步驟弄完後,進入超級管理員介面增加article資料是頁面顯示的就是這個兩個需要增加的空


3. 同步到資料庫
需要在Django專案設定檔案(./<專案檔名>/settings.py)裡面設定使用這個app檔案
檔案內容:
# Application definition

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article', # 加入建立的app名
]
遷移命令:
py manage.py makemigrations -> 製造遷移
py manage.py migrate -> 遷移

執行成功後就可以看到遷移檔案生成並將模板和資料庫聯絡
生成的檔案為<app名>資料夾 --> <migrations>資料夾 --> 0001_initial.py
點選進入可以看到如下內容:

from django.db import migrations, models


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Article',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
# AutoField自動增加欄位 primary_key主鍵
('title', models.CharField(max_length=30)), # 增加的title欄位
('content', models.TextField()), # 增加的文字內容欄位
],
),
]
可以看到生成對應的格式也是按照模板檔案來的

4. 在<app名>資料夾中的admin中註冊應用!!!
admin內容如下:

from django.contrib import admin
from .models import Article

# Register your models here.
admin.site.register(Article) # 註冊app應用

登入超級管理員介面後就可以看見新註冊的欄(article這裡示例的app名稱)
點選進入app
進入app頁面後可以add資料

第四節課: 用模板顯示內容

模型的objects獲取、操作模型的物件
<註冊的app名這裡是Article>.object.get(條件)
<註冊的app名這裡是Article>.object.all()
<註冊的app名這裡是Article>.object.filter(條件)

建立、使用模板
前端頁面和後端程式碼分離,減低耦合性
1. 在<app名>資料夾下建立<tenplates>資料夾
2. 在<tenplates>資料夾中建立HTML檔案
3. 在<app名>資料夾中的views.py將原先耦合的程式碼改為分離
views.py檔案中對應的顯示文章頁面的檢視函式內容如下:

from django.shortcuts import render, render_to_response, get_object_or_404
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)
# context={}
# context["article_obj"] = article
# # return render(request, "article_detail.html", context)
# return render_to_response("article_detail.html", context) # 5. render_to_response更簡便
# except Exception as e:
# raise Http404(e)

# 將Article.objects.get改成使用get_object_or_404來獲取object,可以使得程式碼更簡潔
article = get_object_or_404(Article, pk=article_id)
context = {}
context["article_obj"] = article
return render_to_response("article_detail.html", context) # render_to_response更簡便

# return render(request, "article_detail.html", context) # 4. 使用模板渲染內容

# return HttpResponse("文章 id: %s" % article_id) # 1. 簡單的返回get請求引數
# 2. 下面利用objects獲取資料內容
# return HttpResponse("文章 id: %s, 文章標題:%s, 文章內容:%s" % (article_id, article.title, article.content))
# 3. 下面新增html5樣式
# return HttpResponse("<h2>文章 id: %s</h2> <br>文章標題:%s<br>文章內容:%s" % (article_id, article.title, article.content))

對應的模板HTML檔案為:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>{{article_obj.title}}</h2>
<hr>
<p>{{article_obj.content}}</p>
</body>
</html>
可以看到這邊用的資料就是views.py 檔案中傳過來的字典的key(article_obj)

4. 在<專案檔名> --> <專案檔名> --> urls.py檔案中加入對應的路徑
這個就補貼示例程式碼,基本和之前加入路徑的方式一樣,後面有改進方案

這個不好的地方是一旦專案大起來後,這邊總的urls.py 檔案非常的混亂,不利於管理在最後一個知識點會講到怎麼弄


文章列表
這個也是在<app名>資料夾下views.py 檔案中編寫對應的檢視函式,同時在templates資料夾中增加對應的HTML檔案

檢視函式:
def article_list(request):
article = Article.objects.all() # 獲取所有文章資料
context = {}
context["articles"] = article
return render_to_response("article_list.html", context) # 傳入HTML中

HTML檔案,記錄了一些改進以及改進前的程式碼使用#註釋掉 方便後面回憶
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for article in articles %}
<!--<p>{{article.title}}</p>--> <!--1. 普通的將所有文章的標題羅列-->
<!--<a href="/article/{{article.pk}}">{{article.title}}</a>--> <!--將所有文章的標題羅列,並且這些文章標題都可以連線到文章對應的網頁-->
<a href="{% url 'article_detail' article.pk %}">{{article.title}}</a><!--改進:使用在urls檔案中定義的name標籤跳轉-->
{% endfor %}
<!--{{ articles }}--> <!-- 換成上面那種,將文章的標題迴圈列出-->
</body>
</html>



總urls包含app的urls
總urls.py 檔案
from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
path('admin/', admin.site.urls),
path('', views.index), # 加入路徑
path('article/', include("article.urls")) # 加入子app下的urls.py,且因為article已經註冊過時app了,所以不需要匯入
]
子app下的urls.py 檔案, 筆記在程式碼中
from django.urls import path
from .views import article_detail, article_list


urlpatterns = [
# name引數的作用: 是標記這個功能對應的path,在使用模板將所有文章羅列時,並且可以跳轉到對應頁面,這個時候可以使用name,這樣子後面函式名改了
# 也不會需要那麼大改動,像html模板裡面基本用的是檢視函式傳進去的key
path('<int:article_id>', article_detail, name="article_detail"), # 加入app檢視檔案中article_detail檢視函式
path('', article_list, name="article_list") # 加入app檢視檔案中article_list檢視函式
]

hh這兩節課的內容有點多,終於整理一遍了
總結這節課就是將子app的所有東西包括路由設定、模板、檢視函式遷移到自己的檔案下,方便管理