Django创建表单上传图片

IOS开发中需要为创建的数据保存到网络后台长久存储,刚开始想到的是直接连接mysql,但要在ios中安装mysql的控件,实在是麻烦。于是定义一个restful接口,通过http请求的方式来上传和获取数据,是一种比较方便的方式。
本文是基于Django框架,实现以下几个功能:

  • Model和ModelForm创建表单
  • POST上传图片

一、建立Model与mysql连接

1,定义model

# models.py

from django.db import models
from django.utils.timezone import now

# Create your models here.
class CureData(models.Model):
    STATUS_SIZES = (
        (0, '进行中'),
        (1, '已完成'),
    )

    name = models.CharField('名称', max_length=50)
    cureDuration = models.IntegerField('时长')
    create_at = models.DateTimeField("日期", default=now())
    note = models.CharField('备注', max_length=200, blank=True)
    image = models.ImageField('图片', upload_to='photos', blank=True)
    operator = models.CharField('操作者', max_length=50, blank=True)
    status = models.IntegerField('状态', default=0, choices=STATUS_SIZES) # 0,进行中; 1,已完成

    class Meta:
        ordering = ['create_at']

    def __unicode__(self):
        return self.name

2,配置数据库:

在工程的settings.py中设置database

# settings.py
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysite',
        'USER': 'user',
        'PASSWORD': 'yourpassword',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}

3,models.py同步到数据库

在shell中移到路径到当前工程根目录,执行命令:

python manage.py makemigrations mysite
python manage.py migrate

二、建立表单

1, forms.py

from django import forms
from models import CureData

class CureDataImageForm(forms.ModelForm):

    class Meta:
        model = CureData
        fields = '__all__'  # ['name', 'create_at',  ...] 

表单中有ImageField,需要在项目的settings.py中添加MEDIA_ROOT路径:

MEDIA_ROOT = './Data/media/'

model中定义的image的参数upload_to='photos',上传的图片将保存至./Data/meida/photos/目录下。

2, views.py

from mysite.forms import CureDataImageForm

def update_data(request):
    if request.method == 'POST':

        form = CureDataImageForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            image = form.save()
            print image.image.url
  
            return HttpResponseRedirect('/mysite/success/')
    else:
        form = CureDataImageForm()
    return render_to_response('mysite/data_form.html', {'form': form})

3, urls.py

# mysite/urls.py

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

urlpatterns = [

    url(r'^update_data/$', views.update_data),
    url(r'^success/$', views.success),
]

4, html文件

views.py中需要的两个html文件放在mysite/templates/mysite/目录下。
Form要支持上传图片,需要在form中设置 enctype="multipart/form-data",不设置的话文件不支持上传。

data_form.html

<!-- data_form.html -->
<html>
<head>
    <title>data update</title>
</head>
<body>
    <h1>data update</h1>

    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post", enctype="multipart/form-data">
        <table>
            {{ form.as_p }}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

success.html

<!-- success.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Success!</title>
</head>
<body>
<div>Success!</div>
</body>
</html>

三、另一种表单创建方式

上面创建表单是一种比较简洁的方式,如果不想所有字段保存到数据库,可以用另一种方式:

1,forms.py

from django import forms
from django.utils.timezone import now

class CureDataForm(forms.Form):
    name = forms.CharField(label="名称")
    cureDuration = forms.IntegerField(label="时长")
    create_at = forms.DateTimeField(label="创建时间", initial=now())
    note = forms.CharField(label="备注", required=False)
    image = forms.FileField(label="图片", required=False)
    operator = forms.CharField(label="操作者")
    status = forms.IntegerField(label="状态")

2, views.py

from mysite.forms import CureDataForm
def update_data(request):
    if request.method == 'POST':

        form = CureDataForm(request.POST or None, request.FILES or None)
        if form.is_valid():
            cd = form.cleaned_data
            print cd
            # img_url = form['image']
            # print img_url
            # 根据用户提交的注册信息在用户信息表中建立一个新的用户对象
            cureData = CureData.objects.create(
                name = form.cleaned_data['name'],
                cureDuration = form.cleaned_data['cureDuration'],
                create_at = form.cleaned_data['create_at'],
                note=form.cleaned_data['note'],
                image=form.cleaned_data['image'],
                operator=form.cleaned_data['operator'],
                status=form.cleaned_data['status'],
            )
            cureData.save()
            return HttpResponseRedirect('/bbcure/success/')
    else:
        form = CureDataForm()
    return render_to_response('bbcure/data_form.html', {'form': form})

四、效果

shell中执行:

manage.py runserver 0.0.0.0:8000

然后在浏览器中打开http://0.0.0.0:8000/mysite/update_data/

注:mysite为项目名称


提交后,数据库中如下:


五、总结

用Django创建站点很方便,只需很少的代码就能架构出一个功能很复杂的网页。本文只是冰山一角,从表单这一小块阐述Django的快速实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容