`
maplye
  • 浏览: 114668 次
  • 来自: ...
社区版块
存档分类
最新评论

[django]newforms两种方式示例

阅读更多
newforms是django新的对表单处理功能,查看官方文档:
http://www.djangoproject.com/documentation/newforms/
最近也在看newsform的文章,总结了两种使用的方法,如下所示:
一、根据model自动生成newsform
model:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--># Create your models here.
class ResType(models.Model):
    typename 
= models.CharField('typename',maxlength=20)
    
    
class Admin: pass
    
    
def __str__(self):
        
return self.typename
    

class Resource(models.Model):
    title 
= models.CharField('标题',maxlength=200)
    content 
= models.TextField('内容',null=True, blank=True)
    resdate 
= models.DateTimeField('发布日期',default=DEFAULT_DATE, blank=True)
    restype 
= models.ForeignKey(ResType)
    
class Admin: 
        list_display 
= ('title',)
    
def __str__(self):
        
return self.title

view:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->from django import newforms as forms

def
 public(request, id=None):
    entry 
= None
    
if id is None:
        EntryForm 
= forms.models.form_for_model(Resource)
    
else:
        entry 
= Resource.objects.get(id=id)
        EntryForm 
= forms.models.form_for_instance(entry)
 
    
#EntryForm.fields['detail'].widget = TinyMCE()
 
    
if request.method == 'POST':
        form 
= EntryForm(request.POST)
        
if form.is_valid():
            entry 
= form.save(commit=False)
            entry.save()
 
            
return HttpResponseRedirect("/")
    
else:
        form 
= EntryForm()
 
    t 
= loader.get_template('public.html')
 
    c 
= Context({'form': form,'resource':entry})
    
return HttpResponse(t.render(c)) 
template:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->{% load i18n utiltags %}
{% extends "base.html" %}

{% block head%}

{% endblock %}

{% block body %}  
    
<form enctype="multipart/form-data" action="/resource/public/{%ifnotequal resource None %}{{resource.id}}/{%endifnotequal%}" method="post" id="resource_edit">
        
<div id="message">ddd</div>
        
<table>
        {{ form }}
        
</table>
        
<input type="submit" value="OK">
        
    
</form>
{% endblock %}

这一种方式主要有如下关键点
1.EntryForm = forms.models.form_for_model(Resource)
生成一个具有Model模型的空的Form,用来显示添加表单
2.EntryForm = forms.models.form_for_instance(entry)
根据一个对象来生成含有该对象数据的Form,用来显示带数据的表单
3.数据保存直接可以通过Post过来的数据创建一Form实例,并调用该实例的save方法

二、自定义Form
有时候通过Model自动创建的Form不适合,譬如:Model中的某些属性我不需要显示在页面上,或数据处理方式比较复杂,这个时候你就需要自定义Form.我们先看看代码:
自定义的Form:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->from django.newforms import *
from apps.resource.models import ResType,Tag,Resource


class ResourceForm(Form):
    title 
= CharField(label='标题',required=True)
    content 
= CharField(label='内容',widget=Textarea(attrs={'rows'10'cols'50}))
    resdate 
= DateField(label='发布日期')
    restype 
= ChoiceField(label='类别',
        choices
=[(c.id,c.typename) for c in ResType.objects.all()])
   
    
def __init__(self, data=None, auto_id='id_%s', prefix=None,initial=None, instance=None):
        
if instance is not None:
            self.instance 
= instance
            new_data 
= {}
            new_data[
"title"= instance.title
            new_data[
"content"= instance.content
            new_data[
"resdate"= instance.resdate
            new_data[
"restype"= instance.restype
            data 
= new_data
        
else:
            self.instance 
= None
        super(ResourceForm, self).
__init__(data, auto_id, prefix, initial) 
    
    
def save(self, commit=True):
        
if self.instance is not None:
            instance 
= self.instance
        
else:
            instance 
= Resource()
        
        
print 'test:'+ self.clean_data["restype"]
        
        instance.title 
= self.clean_data["title"]
        instance.content 
= self.clean_data["content"]
        instance.resdate 
= self.clean_data["resdate"]
        instance.restype 
= ResType.objects.get(id=self.clean_data["restype"])
        
        
if commit:
            instance.save()
        
return instance 
该自定义Form类中主要有两部分:
1、重写构造函数,主要是传递数据
2、自定义save方法,用来将Form接收的数据进行处理

View:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->def add_entry(request,id=None):
    
if id is not None:
        instance 
= Resource.objects.get(id=id)
        InstanceForm 
= ResourceForm(instance=instance)
    
else:
        InstanceForm 
= ResourceForm()
        
    
if request.POST:
        form1 
= ResourceForm(request.POST)
        
if form1.is_valid():
            form1.save()
            
return HttpResponseRedirect('/')
            
 
    t 
= loader.get_template('add_entry.html')
 
    c 
= Context({'form': InstanceForm})
    
return HttpResponse(t.render(c)) 

其实View部分和第一种方式很相似的,不同的是Form的创建方式。
Template和以前一样。

只写这么多,作为自己学习的一个记录。

参考资料:
http://code.pui.ch/2007/01/07/using-djangos-newforms/
http://www.djangoproject.com/documentation/newforms/
http://code.djangoproject.com/browser/django/trunk/tests/regressiontests/forms/tests.py















分享到:
评论

相关推荐

    Django与JS交互的示例代码

    首先,我们要理解Django和JavaScript交互的两种基本方法: 1. 页面加载完成后,通过Ajax进行异步通信。这种方法适用于页面不需要整体刷新,但需要动态更新部分内容的情况。例如,用户输入或点击某些元素时,通过...

    Django说明及示例

    - **性能优化**:通过缓存机制、数据库查询优化等方式提高应用性能。 #### 五、其他核心功能 ##### 1. 管理后台 - **自动生成管理页面**:为每个模型自动创建管理页面。 - **权限控制**:支持基于角色的权限控制。...

    【JavaScript源代码】django+vue实现注册登录的示例代码.docx

    总的来说,这个示例展示了Django和Vue.js结合使用时的一个基础架构,涵盖了前端用户界面的交互、数据提交、API调用以及安全措施。实际项目中,还需要考虑更多的细节,如错误处理、用户反馈、数据加密等。同时,...

    Django用户身份验证完成示例代码

    Django 的用户身份验证系统主要包括两个方面:**身份验证(Authentication)** 和 **授权(Authorization)**。 - **身份验证**:验证用户是否为他们声称的身份。通常涉及用户名和密码的校验。 - **授权**:一旦用户...

    django+mysql的使用示例

    在Python的Web开发框架Django中,与MySQL数据库的整合是一项常见的需求。Django支持多种数据库,包括MySQL,这使得开发者可以根据项目需求选择合适的数据库系统。以下是对标题和描述中涉及知识点的详细说明: 1. **...

    基于Django和Django 权限管理系统示例项目.zip

    基于Django和Django 权限管理系统示例项目.zip

    django orm 外键操作-练习示例

    同时,Django 提供了多种方式处理外键,如通过 `related_name` 设置反向查询的别名,以及通过 `select_related` 和 `prefetch_related` 提高查询效率。理解并熟练掌握 Django ORM 中的外键操作对于提升 Django 应用...

    Django学习博客示例代码

    **Django学习博客示例代码** Django是一个高级的Python Web框架,用于快速开发安全且可维护的网站。这个示例代码集是专为初学者设计的,旨在帮助他们掌握Django的基础知识和核心概念。以下是一些关键知识点: 1. *...

    supercaptcha:django newforms 的验证码

    超级验证码supercaptcha 易于使用 django 的验证码字段用法 class MySuperForm ( forms . Form ): captcha = supercaptcha . CaptchaField ( label = u"no robots here" )要求您不需要对形式、中间件、上下文处理器...

    Django注册、登录、注销示例

    `level_1.zip`可能是一个包含示例代码或练习的压缩包,帮助读者更好地理解这些概念。 总的来说,Django的用户认证系统为开发者提供了灵活且安全的工具,用于处理用户的身份验证和授权。通过学习和掌握这些基本功能...

    salt-django-example, Django 部署的salt状态树示例.zip

    salt-django-example, Django 部署的salt状态树示例 salt-django-example将 Django 应用程序部署到生产服务器的salt状态树。堆栈__Ubuntu: 包名称和堆栈的其他部分只与Ubuntu一起使用为wsgi容器提供反向代理,并为 ...

    Django查询数据库的性能优化示例代码

    Django数据层提供各种途径优化数据的访问,一个项目大量优化工作一般是放在后期来做,早期的优化是“万恶之源”,这是前人总结的经验,不无道理。如果事先理解Django的优化技巧,开发过程中稍稍留意,后期会省不少的...

    Django自定义认证方式用法示例

    ### Django自定义认证方式详解 #### 一、引言 Django 是一款非常流行的 Python Web 框架,它提供了一系列强大的内置功能来简化 Web 开发过程。其中,用户认证是构建任何 Web 应用不可或缺的一部分。默认情况下,...

    django学习实践简单示例超详细版本源代码

    本资源“django学习实践简单示例超详细版本源代码”提供了学习Django的基础和进阶示例,旨在帮助初学者理解并掌握其核心概念。 首先,Django的核心组件包括模型(Models)、视图(Views)、模板(Templates)和URL...

    Python-django的celery和redis简单示例项目

    【Python-django的celery和redis简单示例项目】是一个基于Django框架的Web应用程序,它集成并展示了Celery和Redis这两个重要组件的使用。在这个项目中,Celery作为一个分布式任务队列,用于异步处理任务,而Redis则...

    Django示例代码

    Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of Web development, so ...

    Python3.5,django1.10实用例子2

    4. **子进程(subprocess)**:Python的`subprocess`模块提供了一种方式来创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。这在需要执行操作系统命令,比如执行系统工具、运行外部脚本或者管理...

    tutsplus的django示例代码

    【标题】"tutsplus的django示例代码"是一份基于Django框架的教程实践项目,由知名在线教育平台Tutsplus提供。这个项目旨在帮助开发者深入理解和掌握Django的各种功能和最佳实践。 【描述】提到,这个示例代码覆盖了...

    Django实现支付宝付款和微信支付的示例代码

    在众多支付方式中,支付宝和微信支付无疑是应用最广泛的两种支付方式。本文将向您展示如何使用Django框架来实现支付宝支付和微信支付功能,并提供示例代码以供参考。 首先,要实现支付宝支付,开发者需要在蚂蚁金服...

Global site tag (gtag.js) - Google Analytics