Django的ModelForm简单用法

Django 中内置了 Form 和 Model 两个类,有时候页面的表单 Form 类与 Model 类是一一对应,因此分别定义 Form 类和 Model 类会比较麻烦,最简单的方式就是通过 Model 来生成一个 Form 类,Django 内置的 ModelForm 就是为此而生的。下面以一个简单的例子来说明它的简单用法.

基本需求

收集用户的日本报名信息

其中JLPT的日语等级分为N1,N2,N3,N4,N5;所以需要一个选择器.

用户需要手动输入姓名,因此需要一个输入框.

在Project中新建一个app

$ python manager startapp jlpt

文件目录结构如下所示

jlpt1/
├── admin.py
├── __init__.py
├── models.py
├── tests.py
└── views.py

0 directories, 5 files

添加URL规则

url(r'^jlpt/', include('jlpt.urls')),

在jlpt目录下新建一个urls.py文件

from django.conf.urls import patterns, include, url

urlpatterns = patterns('', 
    url(r'^$', 'jlpt.views.home', name='home'),
)

如此一来,当用户在浏览器中输入http://yourdomain.com/jlpt时,会导向到名叫home的view.下面我们来定义home这个view.

定义view

from django.shortcuts import render
from django.http import HttpResponse
from jlpt.forms import ExamInfoForm

# Create your views here.
def home(request):
    if request.method == 'POST':
        form = ExamInfoForm(request.POST)
        if form.is_valid():
            exam_info = form.save()
            exam_info.save()
            return HttpResponse('Thank you')
    else:
        form = ExamInfoForm()
    return render(request, 'jlpt/index.html', {'form_info': form})

当用户post表单时,利用POST数据新建一个ExamInfoForm,把Form中的内容保存成一个instance,然后将instance保存到数据库中.

当用户get表单时,新建一个空的ExamInfoForm.

ExamInfoForm这个类就是我们接下来要创建的ModelForm

创建ModelForm类

在jlpt目录下新建一个forms.py文件

from django.forms import ModelForm
from jlpt.models import ExamInfo
class ExamInfoForm(ModelForm):
    class Meta:
        model = ExamInfo
        fields = '__all__'

ExamInfoForm继承自ModelForm,新建了一个Meta类,model的值为ExamInfo,这个ExamInfo就是一个Model类.

定义Model类

from django.db import models

# Create your models here.
LEVEL_CHOICES = (
    ('N1', 'N1'),
    ('N2', 'N2'),
    ('N3', 'N3'),
    ('N4', 'N4'),
    ('N5', 'N5'),
    ('NO', 'NO'),
)
class ExamInfo(models.Model):
    name = models.CharField(max_length=10)
    level = models.CharField(max_length=2, choices=LEVEL_CHOICES)

这样只需要定义一个Model类,就可以依此创建一个新的Form,当然Form是可以定制的,比如选择需要显示的字段.

添加template文件

<!DOCTYPE html>
</html>    
	<head>
		<title>报名情况统计</title>
	</head>
	<body>
		<p style="text-align:center;font-size:1.5em;">少年よ、大志を抱け!</p>
		<form action="/jlpt/" method="post"> 
		{% csrf_token %}
			<fieldset>
				<legend>你要参加2014年7月JLPT的哪个等级考试?</legend>
		            	{{ form_info.as_p }}
		            	<input type="submit" value="submit" />
		        </fieldset>
		</form>
	</body>
</html>

views.home中的return render(request, 'jlpt/index.html', {'form_info': form})通过传递form(这个html文件中为form_info)来渲染这个页面.

添加后台管理

在jlpt目录下新建一个admin.py文件,代码如下

from django.contrib import admin
from jlpt.models import ExamInfo

# Register your models here.

class ExamInfoAdmin(admin.ModelAdmin):
    list_display = ['name', 'level']
admin.site.register(ExamInfo, ExamInfoAdmin)

通过http://www.yourdomain.com/admin登陆到后台管理系统时,可以看到数据分为namelevel两列.

安装jlpt.

在project的settings.py文件中,为INSTALLED_APPS添加一个新的item.

# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'your project name',
    'jlpt',
)

完成,访问一下

效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值