django基礎使用

django文件作用

urls.py
網址入口,關聯到對應的views.py文件的一個函數,訪問網址對應一個函數。

views.py
處理用戶發出的請求,從urls.py中對應過來,通過templates中的網頁可以將顯示內容(比如登陸的用戶名,用戶請求數據,輸出)到網頁。

models.py
與數據庫操作相關,存入或者讀取數據時會用。

forms.py
表單,用戶在瀏覽器上輸入數據提交,對數據的驗證工作以及輸入框生成等工作。

templates文件夾
views.py中的函數渲染templates中的html模板,得到動態內容的網頁,也可以使用緩存來提高速度。

admin.py
後臺,可以用很少量的代碼就擁有一個強大的後臺。

settings.py
Django 的設置,配置文件,比如 DEBUG 的開關,靜態文件的位置等。

配置虛擬環境

虛擬環境(venv)是pythin多版本管理,可以使得每個項目環境與其他項目獨立起來,保持環境乾淨,解決報之間的衝突。

新建我們我們項目的文件夾,進入文件夾,開始配置venv的命令,其中env爲虛擬環境的放置目錄;
在這裏插入圖片描述
創建完成之後,輸入env\Scripts\activate.bat進入虛擬環境:
在這裏插入圖片描述
表示已經成功進入虛擬環境

安裝django 2.1版本
在這裏插入圖片描述
表示安裝成功,安裝完成開始創建工程項目

創建工程

django-admin startproject project 

創建app

在django中一個app代表一個功能模塊。將不通的功能放在不通的模塊中,方便代碼的複用以及管理。進入創建的project的目錄下

python manage.py  startapp myapp

註冊app(激活app)

在project工程下的settings.py文件修改如下:

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
]

django的模型(ORM)

django連接mysql數據庫
每一個模型都映射一個數據庫表,包含存儲的數據的重要字段和行爲
每個模型都是一個 Python 的類,這些類繼承 django.db.models.Model

模型相當於數據庫中數據表
對象相當於數據表中的行
屬性相當於數據表的字段

django默認使用sqlite爲數據庫,我們使用mysql作爲數據庫,前提需要安裝pymysql(python3支持)

django不能創建數據庫,需要自己手動去創建數據庫。如果確定使用該模型(數據庫),需要在工程項目下的settings.py文件修改如下:用於連接數據庫

DATABASES = {
    'default': {
        #將sqlite數據庫改成mysql數據庫
        'ENGINE': 'django.db.backends.mysql', 
        #需要操作的數據庫名(提前創建好的)
        'NAME': 'databasename',
        #用於連接數據庫的用戶
        'USER': 'username',
        #連接數據庫用戶的密碼
        'PASSWORD': 'password',
        #連接數據庫的主機ip
        'HOST': '主機ip',
        #數據庫的端口號
        'PORT': '3306',
    }
}

然後在工程下__init__.py文件添加:

import pymysql
#主要作用告訴django使用pymysql代替mysqldb
pymysql.install_as_MySQLdb()

在應用下創建模型
在myapp項目的modles.py文件添加內容
定義students的數據表,字段Name,sex,age,contend

class Students(models.Model):
    name = models.CharField(max_length=20)
    sex = models.BooleanField(default=True)
    age = models.IntegerField()
    contend = models.CharField(max_length=30)

模型的字段
模型中每一個字段都應該是相應類的實例, Django 利用這些字段類來實現下面這些功能:
字段類型用以指定數據庫數據類型
默認的HTML表單輸入框</ref/forms/widgets>
用於Django admin和自動生成表單的基本驗證

默認情況下, Django 會給每一個模型添加下面的字段:一個自增的主鍵,每個模型都需要擁有一個設置了 primary_key=True 的字段。

id = models.AutoField(primary_key=True)
  • primary_key=True
    如果設置爲 True ,將該字段設置爲該模型的主鍵。
  • unll
    如果設置爲 True , 當該字段爲空時,Django會將數據庫中該字段設置爲 NULL 。默認爲 False。
  • blank
    如果設置爲 True ,該字段允許爲空。默認爲 False 。
    注意該選項與 False 不同, null 選項僅僅是數據庫層面的設置,然而 blank 是涉及表單驗證方面。如果一個字段設置爲 blank=True ,在進行表單驗證時,接收的數據該字段值允許爲空,而設置爲 blank=False 時,不允許爲空
  • unique
    如果設置爲 True,這個字段必須在整個表中保持值唯一。
  • default
    該字段的默認值。可以是一個值或者是個可調用的對象,如果是個可調用對象,每次實例化模型時都會調用該對象
  • choices
    該參數接收一個可迭代的列表或元組(基本單位爲二元組)。如果指定了該參數,在實例化該模型時,該字段只能取選項列表中的值。

生成遷移文件

在project的工程目錄下

E:\PycharmProjects\myword>python manage.py makemigrations
Migrations for 'myapp':
  myapp\migrations\0001_initial.py
    - Create model Students

執行遷移文件

E:\PycharmProjects\myword>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, myapp, 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 myapp.0001_initial... OK
  Applying sessions.0001_initial... OK

數據庫查看是否生成student的表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| dedecmsv           |
| django             |
| information_schema |
| jeecg              |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
mysql> use django;
mysql> show tables;
+----------------------------+
| Tables_in_django           |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| myapp_students             |
+----------------------------+
mysql> desc myapp_students;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20) | NO   |     | NULL    |                |
| sex     | tinyint(1)  | NO   |     | NULL    |                |
| age     | int(11)     | NO   |     | NULL    |                |
| contend | varchar(30) | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

ORM模型操作mysql數據庫

刪除數據表
將應用下的modles.py文件的函數註釋,再次執行遷移文件並且執行遷移文件,查看數據庫的表已經刪除
修改數據表
將應用下的modles.py文件的類的屬性修改,再次執行遷移文件並且執行遷移文件,查看數據庫的表已經刪除
pycharm連接數據庫
在這裏插入圖片描述
在這裏插入圖片描述
自動下載安裝驅動:
在這裏插入圖片描述
安裝完成填寫上面數據庫連接的主機,用戶密碼等等;完成後點擊test連接,出現成功表示測試成功;
在這裏插入圖片描述
表示連接成功;

啓動項目

E:\PycharmProjects\myword>python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
April 16, 2019 - 21:48:21
Django version 1.11.11, using settings 'myword.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

瀏覽器測試:127.0.0.1:8000(本機運行)
在這裏插入圖片描述

創建視圖

在myapp項目的views.py文件修改

from django.http import HttpResponse

def index(request):
    return HttpResponse('hello world!')

設置路由

在project項目的urls.py文件修改

from django.conf.urls import include,url
from django.contrib import admin
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^',include('myapp/urls'))
]

在myapp項目創建urls.py文件,並且修改

from django.conf.urls import url
from . import views

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

瀏覽器訪問:127.0.0.1:8000
在這裏插入圖片描述

創建模板

在project工程的settings.py文件配置模板目錄

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, '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的工程下創建templates的模板目錄,可以在模板目錄下爲每個項目創建項目模板目錄,爲myapp項目模板創建index模板,修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主頁</title>
</head>
<body>
   <h1>hello world!</h1>
</body>
</html>

在對myapp項目的views.py文件修改

def index(request):
    #return HttpResponse('hello world!')
    return render(request,'myapp/index.html')

瀏覽器訪問:127.0.0.1:8000
在這裏插入圖片描述

實踐時各種坑

最近看python編程從入門到實踐,對於django後面的簡單教程,下來自己實際動手操作一遍,加深對於django的模式理解。下面是在操作過程中遇見的問題:

第一個報錯

TypeError: 'set' object is not reversible

在這裏插入圖片描述
網上基本就是在urls.py文件中urlpatters是[]列表格式被自己寫成{}字典格式,將字典修改爲列表即可

第二個報錯
第二個錯誤是在視圖中已經從數據庫得到自己想要的數據,然而在第二步將數據填充到字典時,因爲自己將字典的key值搞錯了,導致後期再模板中顯示不到數據。
在這裏插入圖片描述
在這裏插入圖片描述
瀏覽器顯示:
在這裏插入圖片描述
找到原因後將字典的topic修改成topics然後就可以正常顯示
在這裏插入圖片描述
第三個錯誤

NoReverseMatch at /new_entry/1/
Reverse for 'topic' with arguments '('',)' not found. 1 pattern(s) tried: ['topics/(?P<topic_id>\\d+)/$']

模板的代碼如下:

{% block content %}

    <p><a href="{% url 'learning:topics' topic_id %}" >{{ topic }}</a></p>

    <p>添加新的條目:</p>
    <form action="{% url 'learning:topic' topic_id %}"  method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">完成</button>
    </form>

{% endblock content %}

提示反響解析錯誤,報錯時很懵不知道自己錯在什麼地方,網上查詢了很多資料,出錯原因有很多種,

問題可能在topic_id沒有取到值,(在實際中也將topic_id修改爲數字,然後可以訪問了,但是添加的條目都是在定義好的的id值中)但是從下面可以已經取到正確值
在這裏插入圖片描述
但是在前端頁面展示出現問題,後面可能問題出在{% url ‘learning:topic’ topic_id %}中 topic_id展示前端頁面。(索性將url全部刪除竟然可以正常訪問,而且條目可以正常添加),這種方法不知道存不存在問題,後面做完整個教程在看看

{% block content %}

    <p><a >{{ topic }}</a></p>

    <p>添加新的條目:</p>
    <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button name="submit">完成</button>
    </form>

{% endblock content %}

在這裏插入圖片描述

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