Django实现一个页面上传Char和Image至后台MySQL
网上关于Django文件上传的教程,大多数使用单独页面,并在上传完成后页面跳转,这种方法虽然利于展示,但是对刚熟悉Django和html的新手来说不太友好,对于将文本和图片同时上传至数据库的简单需求可以用如下方法解决:
首先在MySQL中建立数据库,在Django中注册项目、连接数据库,并定义
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#//数据库的类型
'USER': 'root', #数据库服务器的用户
'PASSWORD': 'root', #密码
'NAME': 'Mydata',
# 'NAME': 所使用的的数据库的名字,大小写字母和MySQL中完全对应
'HOST': '127.0.0.1', #主机
'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')
#设置静态文件路径为主目录下的media文件夹
MEDIA_URL = '/media/'
#url映射
models.py
在数据库中定义字段格式,在这里定义了5个Char类型和一个Image类型:
#数据库
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
然后在页面后台中增加获取数据和存入数据库的语句:
#上传
def upload(req):
if req.method == 'POST':
uf = UserForm(req.POST,req.FILES)
if uf.is_valid():
#获得表单数据
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']
#添加到数据库
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数据表中,图片则是存储其在服务器中的路径。
网友评论