首先安裝django包,我使用的是pycharm,因此直接在IDE中就能夠直接安裝,可是django還須要手動配置系統變量html
找到python根目錄下的django文件夾中的bin文件夾與python的Scripts文件夾並加入系統變量path中前端
如個人文件夾路徑爲:python
C:\Users\11573\AppData\Roaming\Python\Python36\site-packages\django\bin
C:\Users\11573\AppData\Roaming\Python\Python36\Scripts
打開命令行並輸入django-admin,若是有返回不報錯,則環境配置正確web
如:sql
C:\Users\11573>django-admin Type 'django-admin help <subcommand>' for help on a specific subcommand. Available subcommands: [django] check compilemessages createcachetable dbshell diffsettings dumpdata flush inspectdb loaddata makemessages makemigrations migrate runserver sendtestemail shell showmigrations sqlflush sqlmigrate sqlsequencereset squashmigrations startapp startproject test testserver Note that only Django core commands are listed as settings are not properly configured (error: Requested
setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable
DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).
而後進入項目文件夾目錄,打開命令行切換至當前目錄並輸入:django-admin startproject myblogshell
如:數據庫
D:\pythonwork\blogtest>django-admin startproject myblog
無返回報錯則成功建立項目django
咱們在命令行切換至項目文件中,而後輸入python manage.py runserver瀏覽器
如:安全
D:\pythonwork\blogtest\myblog>python manage.py runserver
這時咱們能夠開啓django自帶的服務端
咱們會獲得以下結果:
D:\pythonwork\blogtest\myblog>python manage.py runserver Performing system checks... System check identified no issues (0 silenced). You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. June 12, 2019 - 21:01:46 Django version 2.0.8, using settings 'myblog.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. [12/Jun/2019 21:01:54] "GET / HTTP/1.1" 200 16348 [12/Jun/2019 21:01:54] "GET /static/admin/fonts/Roboto-Bold-webfont.woff HTTP/1.1" 200 82564 Not Found: /favicon.ico [12/Jun/2019 21:01:54] "GET /favicon.ico HTTP/1.1" 404 1972
咱們能夠看到 Starting development server at http://127.0.0.1:8000/ 咱們將這個地址輸入在瀏覽器能夠看到django開啓的服務端
固然8000端口是默認端口咱們能夠更改,例如咱們想要改爲9999端口則只需將命令改成:
python manage.py runserver 9999
接下來咱們用IDE打開項目能夠看到建立的myblog項目文件夾下有4個文件:
WSGI (Python Web Server Gateway Interface) Python服務器網關接口
這個文件至關於Python應用與Web服務器之間的接口,項目與外部通訊的關鍵
咱們不用過多瞭解
這個文件是url配置文件,咱們的項目中的全部地址頁面都須要咱們手動去配置添加
settings.py文件中是一些設置,咱們經常使用的有如下幾個:DEBUG ALLOWED_HOSTS INSTALLED_APPS DATABASES
DEBUG=True 意思是在調試BUG時是否前端能夠顯示,若是 DEBUG=False 咱們則看不到剛剛看到的小火箭網頁界面固然通常狀況下咱們不會將錯誤顯示在前端。
ALLOWED_HOSTS=[] 是爲了限定請求中的host
值,以防止黑客構造包來發送請求。只有在列表中的host
才能訪問。
例如咱們傳入127.0.0.1
ALLOWED_HOSTS = ['127.0.0.1']
可是咱們若是使用localhost訪問會怎麼樣呢?
則會出現錯誤沒法訪問網頁
INSTALLED_APPS中則是寫一些咱們應用的定義,例如一會咱們在myblog文件夾下建立blog應用,則須要把blog寫入INSTALLED_APPS中
DATABASES數據庫,django默認的是sqlite3,固然咱們也能夠換成其餘數據庫,這須要去文檔尋找更改其餘數據庫所需的配置
建立好咱們的項目以後咱們就要建立本身的應用了,一樣使用命令行命令
打開命令行,進入項目中manage.py的同級目錄
輸入:
D:\pythonwork\blogtest\myblog>python manage.py startapp blog
而後咱們須要把應用名添加到剛剛提到的settings.py中的INSTALLED_APPS中
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog' ]
注意:應用名稱不能夠與python的庫名稱相同
這時候咱們能夠看到項目下的blog文件夾,這就是咱們剛剛建立的應用
數據移植(遷移)模塊
做用:用來存放經過makemigrations命令生成的數據庫腳本,這裏的內容通常不要手動去改
規定:app目錄下必需要有migrations目錄且目錄下必須有__init__.py才能正常使用數據庫同步的功能
該應用的後臺管理系統配置文件
該應用的配置文件
數據模塊
django使用ORM框架,對象-關係映射(Object/Relation Mapping,簡稱ORM),是隨着面向對象的軟件開發方法發展而產生的。面向對象的開發方法是當今企業級應用開發環境中的主流開發方法,關係數據庫是企業級應用環境中永久存放數據的主流數據存儲系統。對象和關係數據是業務實體的兩種表現形式,業務實體在內存中表現爲對象,在數據庫中表現爲關係數據。內存中的對象之間存在關聯和繼承關係,而在數據庫中,關係數據沒法直接表達多對多關聯和繼承關係。所以,對象-關係映射(ORM)系統通常以中間件的形式存在,主要實現程序對象到關係數據庫數據的映射。咱們建立的對象django會幫咱們自動造成數據庫文件。
咱們建立數據表都是在這裏面建立
自動化測試模塊
django提供了自動化測試功能,咱們在這個文件中編寫測試腳本
執行響應的代碼所在模塊,代碼邏輯處理的主要地點,項目中大部分代碼均在這個文件編寫
打開應用的views.py文件
from django.shortcuts import render # Create your views here.
以後進行編寫函數
from django.shortcuts import render from django.http import HttpResponse #引入庫函數 def index(request): return HttpResponse("Hello,world!")
而後配置url
打開myblog文件下的urls.py
from django.contrib import admin from django.urls import path urlpatterns = [ path('admin/', admin.site.urls), ]
能夠看到文件中提供了樣例,咱們只須要再寫出一個咱們本身規定的url便可
from django.contrib import admin from django.urls import path import blog.views as bv #引入咱們剛剛寫的函數 urlpatterns = [ path('admin/', admin.site.urls), path('index/', bv.index), ]
以後咱們打開服務端 仍是命令行python manage.py runserver
而後咱們打開網址http://127.0.0.1:8000/index/
便可以看到
至此,咱們的第一個響應就完成了
以前咱們在myblog文件夾的urls.py下直接編寫了url,可是若是咱們的項目有不少的url怎麼辦,難道咱們要都放在根url文件下嗎,所以咱們能夠用一個更爲有效與標準的方法
在myblog文件夾的urls.py中首先咱們引入include方法,並編寫以下代碼
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls')), ]
咱們能夠看到include中引入了blog.urls 因此咱們須要在應用文件blog下建立一個urls.py文件
並手動寫入url
from django.urls import path,include from . import views urlpatterns = [ path('index/', views.index), ]
而後運行服務端,看下結果 卻發現如今須要輸入網址http://localhost:8000/blog/index/ 才能夠看到結果
這是由於咱們在兩個urls文件中分別寫入了blog/與index/ 另外咱們能夠引入re_path將url用正則表示
在blog的urls文件中
from django.urls import path,re_path from . import views urlpatterns = [ #path('', views.index), re_path(r'^index$',views.index)#帶正則的urlpath ]
注意事項:myblog文件夾中的urls.py即根urls.py是針對APP配置的url名稱,是該APP全部url的總路徑
django中的Templates其實就是一個一個的html文件,使用了django模板語言(Django Template Language, DTL)
一樣咱們也可使用第三方的模板語言,只須要在項目的settings.py的TEMPLATES中進行相應的更改,本文仍用默認的DTL
首先咱們在APP文件下建立名爲Templates的目錄(文件夾),並在該目錄下建立html文件
例如我建立名爲index的html文件,在html文件的<body></body>中寫入測試語句
<body> <h1>Hello,Blog!</h1> </body>
最後一步咱們須要在views.py中返回render(), 修改views.py代碼
from django.shortcuts import render from django.http import HttpResponse def index(request): return render(request,'index.html')
而後咱們打開地址http://127.0.0.1:8000/blog/index 能夠看到效果以下
render()中能夠傳入第三個參數,例如:
from django.shortcuts import render from django.http import HttpResponse def index(request): return render(request,"index.html",{"hello":"Hello,Blog!"})
而後咱們的html中就能夠直接引用hello,修改html文件的 <body></body>以下
<body> <h1>{{hello}}</h1> </body>
再次輸入網址,咱們發現效果是與以前一樣的
注意:若是咱們有多個應用而且多個應用中含有相同的html文件名稱,這時候Templates只會引用名稱相同的第一個html文件,解決方法是在APP的Templates目錄下建立以APP名爲名稱的目錄,並將html文件所有放進去,並將views.py中的代碼修改一下
from django.shortcuts import render from django.http import HttpResponse def index(request): return render(request,"blog/index.html",{"hello":"Hello,Blog!"}) #原先爲"index.html"
至關於把Templates文件夾下新加進去的blog目錄添加到views.py的html引用中
目錄結構以下:
一般,一個Model對應數據庫的一張數據表,django中Models以類的形式表現,它包含了一些基本字段以及數據的一些行爲
在django中,咱們以建立類的形式建立數據表,所以咱們全部對於數據庫的操做實際上就是對於類對象的操做,不須要sql語句來跟
數據庫進行交互,這種結構就是ORM。
首先咱們打開models.py,建立類及字段(類中的屬性),繼承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同級目錄
執行python manage.py makemigrations app名稱 命令
D:\pythonwork\blogtest\myblog>python manage.py makemigrations blog Migrations for 'blog': blog\migrations\0001_initial.py - Create model Article
再執行python manage.py migrate 的數據遷移命令
D:\pythonwork\blogtest\myblog>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying blog.0001_initial... OK
Applying sessions.0001_initial... OK
此時咱們的數據表已經生成了
能夠看到migrations生成了一個0001文件,這就是咱們剛剛建立的類數據遷移造成的文件
打開該文件能夠看到一些內容
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')), ('title', models.CharField(default='Title', max_length=32)), ('content', models.TextField(null=True)), ], ), ]
咱們發現operations中多了一個名爲id的數據類型,這是由於剛纔建立類的時候咱們並無建立主鍵屬性,因此自動生成了名爲id的主鍵屬性
注意:咱們若是要對數據庫的字段增長,例如增長一個發佈日期,則在代碼中寫完以後須要從新數據遷移
查看
咱們能夠執行python manage.py sqlmigrate App名 文件id來查看類的數據遷移的sql語句
D:\pythonwork\blogtest\myblog>python manage.py sqlmigrate blog 0001 BEGIN; -- -- Create model Article -- CREATE TABLE "blog_article" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(32) NOT NULL, "content" text NULL); COMMIT;
同時咱們會發現項目目錄下多了一個名爲db.sqlite3的數據庫文件,沒錯,這就是咱們造成的數據庫
咱們能夠打開sqlite編輯數據
例如:
頁面展現數據
首先咱們在views.py中import models,並修改代碼
from django.shortcuts import render from django.http import HttpResponse from . import models def index(request): article=models.Article.objects.get(pk=1)#該語句中pk=1 即Primary key=1 固然咱們也能夠用本身建立的其餘屬性 return render(request,"blog/index.html",{"article":article})#render返回前端
修改html代碼以下:
<body> <h1>{{article.title}}</h1> <h3>{{article.content}}</h3> </body>
運行服務端,打開網頁,可看到以下效果
Admin是Django自帶的一個功能強大的自動化數據管理界面
被受權的用戶能夠直接在Admin中管理數據庫,而且Django提供了許多針對Admin的定製功能
命令行執行命令
D:\pythonwork\blogtest\myblog>python manage.py createsuperuser
接下來按照指引輸入用戶名密碼便可
超級用戶建立成功以後咱們就能夠登陸後臺管理系統了,打開服務端,瀏覽器地址欄輸入127.0.0.1:8000/admin 而後登陸,便可看到管理界面
管理界面是英文的,咱們能夠修改settings.py中的代碼來改爲中文
LANGUAGE_CODE = 'zh_Hans'#語言修改成漢語
TIME_ZONE = 'Asia/Shanghai'#時區修改成上海
能夠發現當前的管理界面並無咱們的應用數據,所以還須要配置應用
首先在應用下的admin.py文件中導入自身models模塊,而後添加代碼
admin.py完整代碼以下
from django.contrib import admin from . import models admin.site.register(models.Article)
而後咱們就能夠在管理界面看到咱們的應用數據了
可是咱們點進去發現只能看到Article object,咱們想要直接看到文章的標題能夠嗎?
固然,咱們須要修改一些代碼
對了,就是使用python的__str__方法,在Article類下(models.py文件中)添加這個方法
models.py完整代碼以下
from django.db import models class Article(models.Model): title=models.CharField(max_length=32,default="Title") content=models.TextField(null=True) def __str__(self): return self.title
而後在看管理界面就能夠看到標題了
總的來講咱們須要製做 博客主頁面,博客內容頁面,博客編寫頁面 固然這些頁面還須要經過超連接來鏈接起來 總不能咱們一直手動輸入地址
主頁面須要展現 文章標題列表與發表博客按鈕(超連接)
文章列表編寫思路
·取出數據庫中的文章對象
·將對象傳遞到前端
·前端頁面將文章標題以超連接方式逐個列出
在django templates中的html文件中,咱們可使用如
{% for xx in xxs %}
html語句
{% end for %}
來執行循環體
首先修改後臺views.py中的index函數代碼:
def index(request): articles=models.Article.objects.all()#選取全部對象 return render(request,"blog/index.html",{"articles":articles})#傳入前端
而後修改templates下文件blog中的index.html文件中的<body></body>代碼
<body> <h1> <a href="">新文章</a> </h1> {% for article in articles %} <a href="">{{ article.title }}</a> <br/> {% endfor %} </body>
超連接先不寫一會繼續更改
而後咱們輸入網址http://127.0.0.1:8000/blog/index進行查看
關於超連接一會等頁面完成後再添加
頁面內容: 文章標題 文章內容 修改文章按鈕(超連接)
首先在views.py中添加函數article_page()
def article_page(request,article_id): article=models.Article.objects.get(pk=article_id) return render(request,'',{'article':article})#html文件位置空着由於html文件還未編寫
接下來在Templates的blog文件夾中新建名爲article_page的html文件
而後將上方代碼中沒有寫的html文件位置加進去
def article_page(request,article_id): article=models.Article.objects.get(pk=article_id) return render(request,'blog/article_page',{'article':article})
修改article_page.html中<body></body>代碼
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/><br/>
<a href="">修改文章</a>
</body>
而後添加url,打開blog下的urls.py修改代碼以下
urlpatterns = [ #path('', views.index), re_path(r'^index$',views.index),#帶正則的urlpath re_path(r'^article/(?P<article_id>[0-9]+)$',views.article_page)
#由於article_page()函數還須要一個article_id參數,因此咱們正則匹配須要用到(?P<article_id>[0-9]+)
]
此時在地址欄輸入http://127.0.0.1:8000/blog/article/1可看到文章頁面
因爲文章編寫頁面還沒寫,咱們先配置index頁面中文章標題的超連接
咱們都知道html中用href後面加目標地址表示超連接
在Templates中能夠用「{% url 'app_name:url_name' param %}"表示目標地址
其中app_name表示命名空間namesapce接下來會用到,param爲一個傳入參數的名字(以下文中的article.id)
app_name和url_name都在urls.py中配置
url的再配置
根urls.py,寫在include()的第二個參數位置,namespace='blog'
應用的urls.py 寫在url()的第三個參數位置,name='article_page'
由於根urls.py使用include()引用了應用的urls.py 因此要在根urls.py下加namespace
根的urls.py代碼以下
urlpatterns = [ path('admin/', admin.site.urls), path('blog/', include('blog.urls',namespace='blog')), ]
應用的urls.py代碼以下
app_name='blog'#在django2.0後必須添加這行代碼,不然下面的name='article_page'會出問題 urlpatterns = [ #path('', views.index), re_path(r'^index$',views.index),#帶正則的urlpath re_path(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>
打開index界面,發現點擊頁面上的文章標題能夠正常進入文章界面,可知超連接配置成功
頁面內容: 標題編輯欄 內容編輯欄 提交按鈕
咱們可使用html的表單來完成內容
首先仍是在Templates下的blog文件夾中建立名爲edit_page的html文件
<body> <form action="" method="post"> <label>文章標題 <input type="text" name="title"> </label> <br/> <label>文章內容 <input type="text" name="content"> </label> <br/> <input type="submit"> </form> </body>
此代碼中的action暫時未寫,由於暫未編寫響應函數
而後編寫後臺views.py代碼看一下頁面效果
def edit_page(request): return render(request,'blog/edit_page.html')
相應的在應用urls.py添加url
app_name='blog' urlpatterns = [ #path('', views.index), re_path(r'^index$',views.index),#帶正則的urlpath re_path(r'^article/(?P<article_id>[0-9]+)$',views.article_page,name='article_page'),
re_path(r'^edit/$',views.edit_page,name='edit_page'),#新添加此行
]
編輯響應函數
在views.py中編寫響應函數 可使用request.POST['參數名']獲取表單數據
使用 models.Article.objects.create(title,contient)建立文章對象
在views.py中添加以下代碼
def edit_action(request): title=request.POST.get('title','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 = [ #path('', views.index), re_path(r'^index$',views.index),#帶正則的urlpath re_path(r'^article/(?P<article_id>[0-9]+)$',views.article_page,name='article_page'), re_path(r'^edit/$',views.edit_page,name='edit_page'), re_path(r'^edit/action$',views.edit_action,name='edit_action'), ]
而後在edit_page.html中的表單action中添加url
<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"> </form> </body>
此中的{% csrf_token %}是爲了安全驗證 不然報錯
而後重啓服務端,訪問http://127.0.0.1:8000/blog/edit/發現能夠新建文章成功
順便將index.html中的新文章超連接補齊
<a href="{% url 'blog:edit_page' %}">新文章</a>
打開首頁點擊新文章檢查是否成功
修改文章
咱們還有文章中的修改文章按鈕沒有補齊超連接,這個地方稍微有點麻煩,由於修改文章不是單純的新建文章頁面就能夠,修改文章是要在編輯欄中顯示已有的文章內容才能夠
那麼咱們應該怎麼分別新建文章與修改文章呢?
很簡單咱們再傳入一個參數就能夠了
思路即:
·新文章編輯頁面爲空,修改文章有內容
·修改文章頁面有文章對象
·根據文章ID判斷是否爲新文章 由於已有的文章的ID是從1開始 因此咱們將新文章頁面置0便可判斷
首先修改views.py的edit_page代碼:
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})
接着須要修改應用的urls.py
re_path(r'^edit/$',views.edit_page,name='edit_page'),#原先代碼 re_path(r'^edit/(?P<article_id>[0-9]+)$',views.edit_page,name='edit_page'),#修改後的代碼
而後修改article_page.html與index.html部分代碼
article_page.html修改成:
<a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
index.html修改成: 傳入參數 0 表明着爲新建文章
<a href="{% url 'blog:edit_page' 0 %}">新文章</a>
接下來根據id判斷是否傳入文章對象就OK了
修改edit_page.html
<body> <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> <br/> <input type="submit"> {% else %} <label>文章標題 <input type="text" name="title"> </label> <br/> <label>文章內容 <input type="text" name="content"> </label> <br/> <input type="submit"> {% endif %} </form> </body>
同時咱們須要修改edit_action 由於這時候咱們修改文章實際上仍是新建新文章,因此在edit_action中也須要添加判斷
咱們點擊編輯頁面的提交按鈕時提交表單,因此咱們能夠加一個隱藏的input將article_id 傳入前端
因此在edit_page.html中添加相應代碼(即兩行擴大字體的):
<body> <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> <br/> <input type="submit"> {% else %} <input type="hidden" name="article_id" value="0"> <label>文章標題 <input type="text" name="title"> </label> <br/> <label>文章內容 <input type="text" name="content"> </label> <br/> <input type="submit"> {% endif %} </form> </body>
而後修改views.py中的edit_action代碼添加判斷
def edit_action(request): title=request.POST.get('title','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}) else:#不是新文章就修改標題內容 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})
打開瀏覽器檢驗結果,成功
至此,一個簡易博客就完整的搭建完成了
Templates過濾器
寫在django Templates的html文件中 屬於django模板語言
如何使用:
{{ value|filter1|filter2 }}
例子:
{{ list_nums|length }}這樣會顯示list_nums的長度
例如咱們的網站中的edit_page.html文件代碼中判斷是否爲新建立文章就有大篇幅代碼相同,咱們可使用Templates的過濾器來減小代碼量
<body>
<form action="{% url 'blog:edit_action' %}" method="post">
<!--post請求的表單爲了安全都須要下面這句話-->
{% csrf_token %}
<input type="hidden" name="article_id" value="{{ article.id | default:'0'}}"/>
<label>文章標題
<input type="text" name="title" value="{{ article.title }}"/>
</label>
<br/>
<label>文章內容
<input type="text" name="content" value="{{ article.content }}"/>
</label>
<br/>
<input type="submit"/>
</form>
</body>
default過濾器能夠設置一個缺省值,所以咱們這樣能夠不用判斷新文章,由於新文章並無article.id 會返回空值,因此咱們可使用default設置缺省值0
打開瀏覽器,發現功能都正常
Django Shell
命令行命令 python manage.py shell
能夠直接與整個項目交互
例如:
D:\pythonwork\blogtest\myblog>python manage.py shell Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from blog.models import Article >>> Article.objects.all() <QuerySet [<Article: hello>, <Article: 3>, <Article: 2>, <Article: 123>]>
Admin定製
admin.py文件中能夠寫入其餘不少屬性
好比目前咱們後臺管理界面只能顯示文章標題,咱們要顯示其餘字段或者說添加一個過濾器怎麼辦呢?
首先在admin.py中添加一個繼承自admin.ModelAdmin的類
代碼以下
from django.contrib import admin
from . import models
class ArticleAdmin(admin.ModelAdmin):
pass
admin.site.register(models.Article,ArticleAdmin)#註冊一下類
先不寫內容,測試一下網頁有沒有出錯
顯示其餘字段
只須要在類中添加代碼便可:
class ArticleAdmin(admin.ModelAdmin): list_display = ('title','content')
再返回管理界面
如今就顯示標題和內容了
如今咱們想要添加一個發佈日期,而且可讓按照發布日期排序
首先在models.py中增長字段
from django.db import models class Article(models.Model): title=models.CharField(max_length=32,default="Title") content=models.TextField(null=True) pub_time=models.DateTimeField(auto_now=True)#自動設置當前時間 def __str__(self): return self.title
別忘了數據遷移命令
D:\pythonwork\blogtest\myblog>python manage.py makemigrations
D:\pythonwork\blogtest\myblog>python manage.py migrate
而後在上面提到的類中添加pub_time
class ArticleAdmin(admin.ModelAdmin): list_display = ('title','content','pub_time')
如今頁面也能夠顯示pub_time
過濾器
在類中添加list_filter能夠添加過濾器
class ArticleAdmin(admin.ModelAdmin): list_display = ('title', 'content', 'pub_time') list_filter = ('pub_time',)
看下結果
admin.py還有不少定製的功能,若是須要能夠多去網上查找資料