一. 要有project
創建一個基本的Project, 這樣我們才能開始工作
django-admin startproject <工程名>
二. 要能訪問數據庫
Django說, 要訪問數據庫必須創建app和model, 於是, 我們開始創建
-
首先配置好數據庫
在settings.py中加上自己的數據庫配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, # 如下是我的配置 'test': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'test', 'PASSWORD': 'test123', 'HOST':'localhost', 'PORT':'3306', } }
-
然後定義好模型
在manager.py文件同目錄下, 執行如下命令創建app
django-admin startapp KnowledgePayModel
然後可以看到如下目錄結構
[外鏈圖片轉存失敗(img-hy2fdU5Z-1566125816334)(/home/floyd/.config/Typora/typora-user-images/1566014155470.png)]
然後在project的settings.py下注冊剛剛創建的APP
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # 這是我們自己創建的APP 'KnowledgePayModel', ]
然後執行如下命令從現有數據表中導出模型
python manager.py inspectdb 表名
我使用django + psycopg2 2.8.3執行上述命令時出現如下錯誤
from django.db import models # Unable to inspect table 'payalbum' # The error was: sequence index must be integer, not 'slice' # Unable to inspect table 'paycomment' # The error was: sequence index must be integer, not 'slice' # Unable to inspect table 'payprice' # The error was: sequence index must be integer, not 'slice' # Unable to inspect table 'payvideo' # The error was: sequence index must be integer, not 'slice'
網上查詢是版本兼容有問題, 於是將psycopg強制降級
sudo pip install psycopg2==2.7.7 --force-reinstall
然後就可以正常工作了, 結果如下, 將其複製到models.py中, 然後進行適當的修改即可使用. 注意生成的AutoField一定要指定爲主鍵, 否則Django會認爲沒有主鍵, 從在再隱式給你加一個, 然後就會報說一個model中只能有一個AutoField域.
# This is an auto-generated Django model module. # You'll have to do the following manually to clean this up: # * Rearrange models' order # * Make sure each model has one field with primary_key=True # * Make sure each ForeignKey has `on_delete` set to the desired behavior. # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table # Feel free to rename the models, but don't rename db_table values or field names. from __future__ import unicode_literals from django.db import models class Payalbum(models.Model): id = models.AutoField() data = models.TextField() # This field type is a guess. class Meta: managed = False db_table = 'payalbum' class Paycomment(models.Model): id = models.AutoField() data = models.TextField() # This field type is a guess. class Meta: managed = False db_table = 'paycomment' class Payprice(models.Model): id = models.AutoField() data = models.TextField() # This field type is a guess. class Meta: managed = False db_table = 'payprice' class Payvideo(models.Model): id = models.AutoField() data = models.TextField() # This field type is a guess. class Meta: managed = False db_table = 'payvideo'
如果想要使用Django自帶的權限表之類的, 需要執行如下語句, 來生成一系列表
python manager.py migrate
控制檯執行結果如下:
Operations to perform: Apply all migrations: admin, auth, 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 sessions.0001_initial... OK
數據庫裏面如下
[外鏈圖片轉存失敗(img-oOXs5QGN-1566125816334)(/home/floyd/.config/Typora/typora-user-images/1566017457779.png)]
三. 要有靜態資源
將所有靜態資源全部放入templates, 得到的文件結構如下
[外鏈圖片轉存失敗(img-OaIXjbvi-1566125816335)(/home/floyd/.config/Typora/typora-user-images/1566016251249.png)]
修改settings.py中的靜態文件位置配置
STATIC_URL = '/templates/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "templates"),
)
在TEMPLATES的DIRS項中增加templates文件夾
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 只有這個templates是我添加的哦
'DIRS': ['templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
四. 要有路由
在project的urls.py文件中添加我們的路由
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 將knowledgepay這個url導向server這個app,讓它自己處理
url(r'^knowledgepay/', include('server.urls', namespace="server")),
]
在我們自己的app中創建一個urls.py, 定義app內部自己的路由
# 這是app內部的路由
urlpatterns = [
url(r'^$', views.homepage),
url(r'^home', views.homepage),
]
在我們自己app的views.py文件中定義各種視圖處理器
# Create your views here.
def homepage(request):
return render_to_response('login.html')
五. 發揮吧
上面已經把基本的框架都搭好了.我們已經可以
- 可以對url進行路由
- 可以訪問靜態html文件
- 可以訪問數據庫
- 可以訪問自定義的邏輯處理方法
剩下的就是純粹業務上的事情了.
六. 參考資料
如果覺得上面有些地方前後沒有聯繫起來, 那麼可以結合下面這個簡單的菜鳥教程看看
https://www.runoob.com/django/django-tutorial.html
要詳細瞭解, 這裏還有Djang中文版文檔可供參閱
https://docs.djangoproject.com/zh-hans/2.2/intro/
當然這裏還有Django book的中文版翻譯, 供君選擇
http://docs.30c.org/djangobook2/index.html