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 %}