免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7403 | 回复: 6
打印 上一主题 下一主题

django form 第一节 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-31 10:44 |只看该作者 |倒序浏览
django form 是我接触过的框架中最好用的form,之前我也搞过php,也用过php的一些框架。但是感觉他们在处理form的时候都是力不从心。要不就是集成度太高了,不好扩展。要不就是功能不太强大不能应对web现在的复杂的环境,但是我接触了django以后就发现django的form是多少的爽阿。下面我介绍下form的一些基本的东西,可能我介绍的不好。大家不要扔鸡蛋白菜哈!

form表单可以自己定义表单也可以通过继承model来生成:
表单主要完成4个功能
1显示表当的样式(Widget)
2通过规则验证表单数据(Field)
3显示验证错误信息(Form)
4把提交的数据转换成PYTHON的数据类型并提交表单(Form Media)

我分为几节来介绍django form

第一节的话。我主要介绍怎么定义:

表单定义有2种形式。一个是自己定义表单类型。一个是继承model类型。。
1自己定义的表单类型
from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField(required=False)


2继承model类型:

model:

class Article(model.models):

price = models.CharField('价格', max_length=50)


from django.forms import ModelForm
class ArticleForm(ModelForm):
     这个可以重写继承的model的字段类型。。

   比如这里我重新定义下我的表单字段的类型,因为如果是继承model的话。他会根据model的类型来验证表单数据的

比如你model定义的这个字段是char:那么这个字段只允许接受字符类型的数据,这样就能使的form的扩展性更好

例如:我希望price这个字段只接受int类型的数据的话

我就重写:price = forms.CharField(label='价格')
     class Meta:
        model = Article(关联的model)
          fields = ('name', 'title')(定义只包含列出的字段的表单)
          exclude = ('birth_date',)(定义排除列出的字段的表单)

如果你理解了django from的定义的话。继续可以往前学习

论坛徽章:
0
2 [报告]
发表于 2010-03-31 10:47 |只看该作者
django form 第2节

前面讲了django form的定义这一块,对django的form有个大概的认识,这一节我主要讲下django form的验证处理

处理分为两部分:

1form自身处理

2views里的处理

form自身处理:

假如我们定义一个用户的表单

class Member(model.ModelFrom):

    def clean_username(self): 这个是对form里面的<input type="text" name="username">进行验证
        """验证帐号"""
        ....

   如果我们有个需求需要验证比如密码和重复密码是否相同的话。这样验证单个字段的方法就没有用了

  用下面这个就可以解决了

  def clean(self):

   这里就可以验证超过2个字段的数据

           password = self.cleaned_data.get('password', '').strip()
        password1 = self.cleaned_data.get('password1','').strip()
        if password and password1 and  password != password1:
            msg = u'两次密码输入不一致'
            self._errors["password1"] = ErrorList([msg])
            del self.cleaned_data["password1"]
        return self.cleaned_data

哈哈,django的form神奇把

2view的处理:

    if 'POST' == request.method:
        article = Domain.objects.filter(id=aid)[0]
        form = DomainForm(request.POST,instance=article)#这个是把request请求的数据和forml绑定起来

        if form.is_valid():#form验证处理
            form.save()#如果验证通过的话。把form的数据添加到数据库里

如果我们在添加数据到数据库前需要处理一些数据,再入库的话,就可以用到下面一个方法了

   m = form.save(commit=False)

m.title = 'sss'

m.save()


            return HttpResponseRedirect('')
        else:
            tmp['form'] = form#这里是数据没有通过验证的话

    else:
        article = Domain.objects.filter(id=aid)[0]
        tmp['form'] = DomainForm(instance=article)  这个是把django的form和Model结合起来

论坛徽章:
0
3 [报告]
发表于 2010-03-31 10:48 |只看该作者
django form 第3节
第2节讲了下django form的验证处理过程,这一节我们一起来学习下django form 的显示部分

django form的显示部分主要分为2部分:

1统一的显示:

比如在模板里是{{form.as_table}},{{form.as_p}}

这样一次性可以把表单里的所有字段给显示处理:

好处是主要在表单里写一点代码就可以了。缺点是如果你要对单个的表单元素的显示进行控制的的话。那就没办法了。

有需求就有解决办法,下面介绍的是django form 显示单个元素,比如:

{{ field.label_tag }}: {{ field }}
比如我的form有个qq字段。那么就是这样写:
{{ form.qq.label_tag }}#表示在form 里面定义这个字段的名称
{{ form.qq }}#根据这个字段在form定义的类型来决定。假设是char类型。那就是文本框
{{ form.qq.errors.as_text  }}表示如果表单字段验证失败的话,这个代表错误信息
{{ form.qq.help_text }}如果你在form里定义了这个字段的帮助信息的话,就会在这里显示了

好的,django的form就讲到这里了。如果要想知道比较详细的话,可以去看下django的文档。
老王也是根据django的文档来学习的

论坛徽章:
0
4 [报告]
发表于 2012-01-05 17:17 |只看该作者
不错的教程。

论坛徽章:
0
5 [报告]
发表于 2012-01-06 13:55 |只看该作者
正想学习django呢

论坛徽章:
0
6 [报告]
发表于 2014-01-20 17:45 |只看该作者
本帖最后由 没够的Python 于 2014-01-20 17:50 编辑

第四章 Django模板系统

在前一章中,你可能已经注意到我们在例子视图中返回文本的方式有点特别。也就是说,HTML被硬性地直接写入Python代码之中。

这种处理会导致一些问题:

对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。

Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。设计人员和 HTML/CSS 编写人员都不应该通过编辑 Python 代码来完成自己的工作;他们应该处理的是 HTML。

同理,程序员编写 Python 代码和设计人员制作模板同时进行的工作方式效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python 又包含 HTML 的文件的编辑工作。

基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。

模板系统基本知识
模板系统基本知识
让我们深入分析一个简单的例子模板。该模板描述了一个向某个与公司签单人员致谢 HTML 页面。可将其视为一个格式信函:

<html>
<head><title>Ordering notice</title></head>

<body>

<p>Dear {{ person_name }},</p>

<p>Thanks for placing an order from {{ company }}. It's scheduled to
ship on {{ ship_date|date:"F j, Y" }}.</p>

<p>Here are the items you've ordered:</p>

<ul>
{% for item in item_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>

{% if ordered_warranty %}
<p>Your warranty information will be included in the packaging.</p>
{% endif %}

<p>Sincerely,<br />{{ company }}</p>

</body>
</html>
该模板是一段添加了些许变量和模板标签的基础 HTML 。让我们逐句过一遍:

用两个大括号括起来的文字(例如 {{ person_name }} )是 变量(variable) 。这意味着将按照给定的名字插入变量的值。如何指定变量的值呢?稍后就会说明。

被大括号和百分号包围的文本(例如 {% if ordered_warranty %} )是 模板标签(template tag) 。标签(tag)定义比较明确,即:仅通知模板系统完成某些工作的标签。

这个示例模板包含两个标签(tag): {% for item in item_list %} 标签(一个 for 标签) 和 {% if ordered_warranty %} 标签 (一个 if 标签)。

for 标签用于构建简单的循环,允许你遍历循环中的每一项。 if 标签,正如你所料,是用来执行逻辑判断的。在这个例子中标签检测 ordered_warranty 变量值是否为 True 。 如果是,模板系统将显示 {% if ordered_warranty %} 与 {% endif %} 之间的所有内容。 如果不是模板系统不会显示它。它当然也支持 {% else %} 以及其他多种逻辑判断方式。

最后,这个模板的第二段落有一个 filter 过滤器的例子,它能让你用来转换变量的输出, 在这个例子中, {{ship_date|date:"F j, Y" }} 将变量 ship_date 用 date 过滤器来转换,转换的参数是 "F j, Y" . date 过滤器根据指定的参数进行格式输出。过滤器是用管道字符( | )来调用的,就和Unix管道一样.

Django 模板含有很多内置的tags和filters,我们将陆续进行学习. 附录F列出了很多的tags和filters的列表,熟悉这些列表对你来说是个好建议. 学习完第十章,你就明白怎么去创建自己的filters和tags了.

如何使用模板系统
想要在Python代码中使用模板系统,只需遵循下面两个步骤:

可以用原始的模板代码字符串创建一个 Template 对象, Django同样支持用指定模板文件路径的方式来创建 Template 对象;

调用 Template 对象的 render() 方法并提供给他变量(i.e., 内容). 它将返回一个完整的模板字符串内容,包含了所有标签块与变量解析后的内容.

以下部分逐步的详细介绍

创建模板对象

创建一个 Template 对象最简单的方法就是直接实例化它。 Template 类就在 django.template 模块中,构造函数接受一个参数,原始模板代码。让我们深入挖掘一下 Python的解释器看看它是怎么工作的。

大家好

在本书中,我们喜欢用和Python解释器的交互来举例。 你可以通过三个> ( >>> ) 识别它们,它们相当于Python解释器的提示符。 如果你要拷贝例子,请不要拷贝这3个>字符。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
7 [报告]
发表于 2014-01-20 19:53 |只看该作者
情况描述的很详细
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP