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‘,
)

完成,访问一下

Django的ModelForm简单用法

时间: 2024-10-02 21:42:38

Django的ModelForm简单用法的相关文章

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespace是定义命名空间,比如下面这种配置, urlpatterns = [ #课程机构url配置,验证码,每个app可以书写自己的url,然后通过include进来 url(r'^org/', include('oraganization.urls',namespace="org")), ] 2

ORM 一对一 以及csrf 的简单用法

ORM 一对一 1. 什么时候用一对一? 当 一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁 把不怎么常用的字段 单独拿出来做成一张表 然后用过一对一关联起来 2. 优势 既保证数据都完整的保存下来,又能保证大部分的检索更快 3. ORM中的用法 class Author(models.Model): name = models.CharField(max_length=16, unique=True) books = models.ManyToManyField(to='Bo

Django之ModelForm组件

1.Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIE

iOS block-base 动画简单用法+关键帧动画设置线性变化速度的问题

本文转载至 http://www.tuicool.com/articles/aANBF3m 时间 2014-12-07 20:13:37  segmentfault-博客原文  http://segmentfault.com/blog/alan/1190000002411296 iOS的各种动画相漂亮,相信这是吸引很多人买iPhone的原因之一.不仅如此,这还是吸引我做iOS开发的一大原因,因为在iOS上给界面实现一些像样的动画实在是太轻松了! 这里就介绍一下iOS的block-based an

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

Android中资源文件中的字符串数组string-array简单用法

在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子如下: 把相应的数据放到values文件夹的strings.xml文件里,或是其他自定义的xml中都可以,以下操作方法相同. <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="sports"> <item>足球<

expect简单用法

1 #!/usr/expect/bin/expect -f 2 3 4 set loginuser [lrange $argv 0 0] 5 set loginpass [lrange $argv 1 1] 6 set ipaddr [lrange $argv 2 2] 7 set port [lrange $argv 3 3] 8 set timeout [lrange $argv 4 4] 9 set from [lrange $argv 5 5] 10 set to [lrange $ar

Tcpdump 的简单用法

Tcpdump 的简单用法 tcpdump是Linux命令行下使用最广泛的网络分析工具,运行的时候会将网卡运行在混杂模式下,需要root权限才能执行 下面是几个比较常见的参数: -w  保持到指定的文件 -i  指定监听的网卡,缺省显示第一块网卡 -nn 以IP方式显示host -v  显示详细信息 -s  指定数据包大小,缺省是65535 -t  不显示时间 ,缺省是显示时间戳 -c  获取数据包数量,缺省不限制,需要用Ctrl+c来终止 下面是关于命令关键字的说明 1.主要包括host,ne

C++ double转string类型以及MFC控件简单用法

这两天项目需要,测试c++库里面内容.生成jar再给Android调用.我没有学过C++,现在开始记录C++简单用法.测试时候一般都是使用mfc程序来测试,要输入值,显示结果吗.我用的编译环境vs2008. 一.double 转string #include <string> CString strResultx; strResultx.Format(_T("x:%.4f\n"), 89.7887878); 转换结果还是放在strResultx 2.两个字符串相连 CStr