Django實(shí)現(xiàn)一個頁面上傳Char和Image至后臺MySQL
網(wǎng)上關(guān)于Django文件上傳的教程,大多數(shù)使用單獨(dú)頁面闷沥,并在上傳完成后頁面跳轉(zhuǎn)萎战,這種方法雖然利于展示,但是對剛熟悉Django和html的新手來說不太友好舆逃,對于將文本和圖片同時(shí)上傳至數(shù)據(jù)庫的簡單需求可以用如下方法解決:
首先在MySQL中建立數(shù)據(jù)庫蚂维,在Django中注冊項(xiàng)目、連接數(shù)據(jù)庫路狮,并定義
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#//數(shù)據(jù)庫的類型
'USER': 'root', #數(shù)據(jù)庫服務(wù)器的用戶
'PASSWORD': 'root', #密碼
'NAME': 'Mydata',
# 'NAME': 所使用的的數(shù)據(jù)庫的名字虫啥,大小寫字母和MySQL中完全對應(yīng)
'HOST': '127.0.0.1', #主機(jī)
'PORT': '3306' #端口
}
}
由于使用了圖片的media功能,需要在TEMPLATES中聲明:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.media', #加上這一行
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
增加Media文件夾用于存圖片文件:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#設(shè)置靜態(tài)文件路徑為主目錄下的media文件夾
MEDIA_URL = '/media/'
#url映射
models.py
在數(shù)據(jù)庫中定義字段格式奄妨,在這里定義了5個Char類型和一個Image類型:
#數(shù)據(jù)庫
class User(models.Model):
username = models.CharField(max_length=50)
password = models.CharField(max_length=50)
age = models.CharField(max_length=100)
gender = models.CharField(max_length=100)
illhistry = models.CharField(max_length=100)
img = models.ImageField(upload_to='')
def __unicode__(self):
return self.username
定義完成后要遷移:
python manage.py makemigrations
python manage.py migrate
views.py
然后在頁面后臺中增加獲取數(shù)據(jù)和存入數(shù)據(jù)庫的語句:
#上傳
def upload(req):
if req.method == 'POST':
uf = UserForm(req.POST,req.FILES)
if uf.is_valid():
#獲得表單數(shù)據(jù)
username = uf.cleaned_data['username']
password = uf.cleaned_data['password']
age = uf.cleaned_data['age']
gender = uf.cleaned_data['gender']
illhistry = uf.cleaned_data['illhistry']
img = uf.cleaned_data['img']
#添加到數(shù)據(jù)庫
user = User.objects.create(username= username,password=password,age=age,gender=gender,illhistry=illhistry,iris=iris)
user.save()
return HttpResponse('upload success!!')
else:
uf = UserForm()
return render(req,'test.html',context= {'uf':uf})
test.html
頁面中的表單:
#上傳
{% csrf_token %}
<p class="meta-info">
姓名:{{uf.username}}
</p>
<p class="meta-info">
密碼:{{uf.password}}
</p>
<p class="meta-info">
年齡:{{uf.age}}
</p>
<p class="meta-info">
性別:{{uf.gender}}
</p>
<p class="meta-info">
既往病史:{{uf.illhistry}}
</p>
<p class="meta-info">
上傳圖片:{{uf.img}}
</p>
<p class="meta-info">
<input class="mybutton" type="submit" value = "完成" />
</p>
其他
這種方法將文本以Char的形式儲存在MySQl數(shù)據(jù)表中涂籽,圖片則是存儲其在服務(wù)器中的路徑。