django中ModelForm学习系列一~save方法

本文通过实例详细解析Django中的ModelForm如何使用save方法保存由页面POST数据创建的模型对象,涵盖不同形式的save用法,重点在于数据保存到数据库的过程。

我们直接通过例子来讲解:

modes.py 代码如下:

from django.db import models
from django.forms import ModelForm

TITLE_CHOICES = (
    ('MR', 'Mr.'),
    ('MRS', 'Mrs.'),
    ('MS', 'Ms.'),
)

class Author(models.Model):
    name = models.CharField(max_length=100)
    title = models.CharField(max_length=3, choices=TITLE_CHOICES)
    birth_date = models.DateField(blank=True, null=True)

    def __unicode__(self):
        return self.name

class Book(models.Model):
    name = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
forms.py 代码如下:

class AuthorForm(ModelForm):
    class Meta:
        model = Author

class BookForm(ModelForm):
    class Meta:
        model = Book

下面说说save方法

见到的save方法无非有以下几种形式:

<1>通过页面post过来的数据 form接收 直接保存到数据库,同时能够产生对应的modes的一个新对象,为什么要产生,后面讲....这个主要用来保存信息

 f = ArticleForm(request.POST)
new_article = f.save()
<2>从数据库中取出modes的对象,然后通过form参数instance方法能够实例化该form,这个主要用来查看具体的信息
 a = Article.objects.get(pk=1)
 f = ArticleForm(instance=a)
 f.save()
<3>既有post又有instance,则以post为主,这个主要用来修改具体的信息

a = Article.objects.get(pk=1)
f = ArticleForm(request.POST, instance=a)
f.save()
<4>特别注意的是,save方法有个参数叫commit,默认是true,即当使用f.save()的时候,会将数据保存到数据库,但是显示指出commit=false,则不会保存到数据库,这是上面new出来的新对象就会起作用了,这样就可以对数据进行其他的修改了,这个会在后面讲的,,差不多就这几种方法

下面把完整的案例贴出来:---主要针对是保存,其它大家可以自己试试哈。

models和forms端见上面拉

urls.py:

urlpatterns=patterns('',
url(r'^test/modelform/$',testModelForm,name='testModelForm'),
)

views.py

def testModelForm(request):
#    a=Author.objects.get(pk=1)
#    form=AuthorForm(instance=a)
    form=AuthorForm()
    if request.method=='POST':
        form=AuthorForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('welcome'))
    return render_to_response('testModelForm.html',locals(),RequestContext(request))

html端:
{% extends 'base.html' %}
{% block title %}测试ModelForm{% endblock %}
{% block content %}
    <form method="post" action=".">{% csrf_token %}
        <table>
            <tr><td><lable for='id_name'>作者名:</lable></td><td>{{ form.name }}</td><td>{{ form.name.errors }}</td></tr>
            <tr><td><lable for='id_title'>标题:</lable></td><td>{{ form.title }}</td><td>{{ form.title.errors }}</td></tr>
            <tr><td><lable for='id_birth_date'>出生日期:</lable></td><td>{{ form.birth_date }}</td><td>{{ form.birth_date.errors }}</td></tr>
            <tr><td><input type="submit" value="注册" /></td><td><input type="reset" value="重置"/></td><td></td></tr>
        </table>
    </form>
{% endblock %}

后续见下节。。。。





class AuthorForm(ModelForm):
    class Meta:
        model = Author

class BookForm(ModelForm):
    class Meta:
        model = Book
Django中的`ModelForm`是个非常实用的功能,它允许我们基于模型自动生成表单。通过将表单字段映射到对应的数据库字段上,简化了创建、更新数据的过程,并能自动验证用户输入的数据是否合法。 使用`ModelForm`可以做到以下几点: 1. 自动生成HTML `<form>`标签内的各个元素,减少手动编写模板代码的工作量; 2. 根据定义好的模型规则对提交过来的信息做初步校验(比如必填项检查),保证了进入后台处理阶段前已经过滤掉大部分错误信息; 3. 方便地保存新记录或修改已有记录,只需简单调用`.save()`方法即可完成操作。 下面给出段简单的例子展示如何声明以及应用个`ModelForm`: ```python from django.forms import ModelForm from myapp.models import Article # 导入之前定义的文章模型 class ArticleForm(ModelForm): class Meta: model = Article # 指定关联的model类 fields = ['title', 'content'] # 定义需要显示出来的字段列表 # views.py文件中 def edit_article(request, article_id=None): if request.method == "POST": form = ArticleForm(request.POST) if form.is_valid(): form.save() return redirect('some_view') else: try: instance=Article.objects.get(id=article_id) form = ArticleForm(instance=instance) except Article.DoesNotExist: form = ArticleForm() return render_to_response("template.html", {"form": form}) ``` 在这个示例里,当我们要编辑篇已存在的文章时会传入该篇文章ID作为参数去实例化表单对象(`instance=...`),这样就能加载出原有的内容供编辑;如果是新增加篇文章则不需要传递这个额外参数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值