使用Django從零搭建一個小型站點

一. 要有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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章