newforms是django新的对表单处理功能,查看官方文档:
http://www.djangoproject.com/documentation/newforms/最近也在看newsform的文章,总结了两种使用的方法,如下所示:
一、根据model自动生成newsformmodel:
<!--<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和JavaScript交互的两种基本方法: 1. 页面加载完成后,通过Ajax进行异步通信。这种方法适用于页面不需要整体刷新,但需要动态更新部分内容的情况。例如,用户输入或点击某些元素时,通过...
- **性能优化**:通过缓存机制、数据库查询优化等方式提高应用性能。 #### 五、其他核心功能 ##### 1. 管理后台 - **自动生成管理页面**:为每个模型自动创建管理页面。 - **权限控制**:支持基于角色的权限控制。...
总的来说,这个示例展示了Django和Vue.js结合使用时的一个基础架构,涵盖了前端用户界面的交互、数据提交、API调用以及安全措施。实际项目中,还需要考虑更多的细节,如错误处理、用户反馈、数据加密等。同时,...
Django 的用户身份验证系统主要包括两个方面:**身份验证(Authentication)** 和 **授权(Authorization)**。 - **身份验证**:验证用户是否为他们声称的身份。通常涉及用户名和密码的校验。 - **授权**:一旦用户...
在Python的Web开发框架Django中,与MySQL数据库的整合是一项常见的需求。Django支持多种数据库,包括MySQL,这使得开发者可以根据项目需求选择合适的数据库系统。以下是对标题和描述中涉及知识点的详细说明: 1. **...
基于Django和Django 权限管理系统示例项目.zip
同时,Django 提供了多种方式处理外键,如通过 `related_name` 设置反向查询的别名,以及通过 `select_related` 和 `prefetch_related` 提高查询效率。理解并熟练掌握 Django ORM 中的外键操作对于提升 Django 应用...
**Django学习博客示例代码** Django是一个高级的Python Web框架,用于快速开发安全且可维护的网站。这个示例代码集是专为初学者设计的,旨在帮助他们掌握Django的基础知识和核心概念。以下是一些关键知识点: 1. *...
超级验证码supercaptcha 易于使用 django 的验证码字段用法 class MySuperForm ( forms . Form ): captcha = supercaptcha . CaptchaField ( label = u"no robots here" )要求您不需要对形式、中间件、上下文处理器...
`level_1.zip`可能是一个包含示例代码或练习的压缩包,帮助读者更好地理解这些概念。 总的来说,Django的用户认证系统为开发者提供了灵活且安全的工具,用于处理用户的身份验证和授权。通过学习和掌握这些基本功能...
salt-django-example, Django 部署的salt状态树示例 salt-django-example将 Django 应用程序部署到生产服务器的salt状态树。堆栈__Ubuntu: 包名称和堆栈的其他部分只与Ubuntu一起使用为wsgi容器提供反向代理,并为 ...
Django数据层提供各种途径优化数据的访问,一个项目大量优化工作一般是放在后期来做,早期的优化是“万恶之源”,这是前人总结的经验,不无道理。如果事先理解Django的优化技巧,开发过程中稍稍留意,后期会省不少的...
### Django自定义认证方式详解 #### 一、引言 Django 是一款非常流行的 Python Web 框架,它提供了一系列强大的内置功能来简化 Web 开发过程。其中,用户认证是构建任何 Web 应用不可或缺的一部分。默认情况下,...
本资源“django学习实践简单示例超详细版本源代码”提供了学习Django的基础和进阶示例,旨在帮助初学者理解并掌握其核心概念。 首先,Django的核心组件包括模型(Models)、视图(Views)、模板(Templates)和URL...
【Python-django的celery和redis简单示例项目】是一个基于Django框架的Web应用程序,它集成并展示了Celery和Redis这两个重要组件的使用。在这个项目中,Celery作为一个分布式任务队列,用于异步处理任务,而Redis则...
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 ...
4. **子进程(subprocess)**:Python的`subprocess`模块提供了一种方式来创建新的进程,连接到它们的输入/输出/错误管道,并获取它们的返回码。这在需要执行操作系统命令,比如执行系统工具、运行外部脚本或者管理...
【标题】"tutsplus的django示例代码"是一份基于Django框架的教程实践项目,由知名在线教育平台Tutsplus提供。这个项目旨在帮助开发者深入理解和掌握Django的各种功能和最佳实践。 【描述】提到,这个示例代码覆盖了...
在众多支付方式中,支付宝和微信支付无疑是应用最广泛的两种支付方式。本文将向您展示如何使用Django框架来实现支付宝支付和微信支付功能,并提供示例代码以供参考。 首先,要实现支付宝支付,开发者需要在蚂蚁金服...