django form使用

在django中,可以使用form来进行表单验证,甚至自动生成样式(虽然不怎么好看)

1 生成form类

下面是一个典型的form类。

class MemoForm(forms.Form):
    #隐藏控件
    mid = forms.CharField(widget=forms.HiddenInput(), required=False)
    #普通的input控件
    title = forms.CharField(label=u'标题', error_messages= \
        {'required': u'标题不能为空'}, required=True)
    #textarea控件
    body = forms.CharField(label=u'内容', error_messages= \
        {'required': u'内容不能为空'}, widget=forms.Textarea( \
        attrs={'rows': 10, 'cols': 40}))
    #时间控件
    timestamp = forms.DateTimeField(label=u"时间", error_messages= \
        {'required': u'时间不能为空', 'invalid': u'请输入正确的时间'}, \
        initial=django.utils.timezone.now(),\
        input_formats=["%Y/%m/%d %H:%M:%S"], widget=\
        forms.DateTimeInput(attrs={'placeholder': '时间'}, format="%Y/%m/%d %H:%M:%S"))

依例,可以看到form中控件的属性:

label    设置标题

error_messages    设置自定义错误

initial        设置初始值

widget 设置field的实际控件

attrs 定义widget样式

要注意DateTimeField控件的格式化,使用input_formats 和 format 来进行格式化。不能在template中用 timestamp|date:"Y-m-d H:i" 来格式化。否则会在验证的时候出错。

2 使用这个Form

定义完这个form后,就应该写响应代码了。

代码:

def edit(request, mid):
    temp_memo = Memo.objects.get(id=int(mid))
    if temp_memo.author != request.user:
        return HttpResponseForbidden()
    if request.method == "POST":
        form = MemoForm(request.POST)
        if form.is_valid():  # 所有验证都通过
            temp_memo.title = form.cleaned_data['title']
            temp_memo.body = form.cleaned_data['body']
            temp_memo.body.replace("\r\n", "\n").replace("\n", "<br>")
            temp_memo.timestamp = form.cleaned_data['timestamp']
            temp_memo.author = request.user
            temp_memo.save()
            return HttpResponseRedirect('/memo/list')
    else:
        form = MemoForm(initial={'body': temp_memo.body.replace("<br>", "\r\n"), \
                                 'timestamp': temp_memo.timestamp, \
                                 "mid": temp_memo.id, \
                                 "title": temp_memo.title})
    return render(request, 'memo/memo_form.html', {'form': form})

在这个view中,

1)使用form.is_valid() 验证是否和表单中相关属性相符

2)用initial 来确定它的初始值。

3 设定它的templates

3.1 简单设置

在form中,可以使用系统自带的函数来生成相关的控件,有下面几个函数:

{{ form.xx.errors }}   显示form验证返回的错误,验证在form类中定义。

{{form.xx.label_tag}}  生成一个<label/>标签,显示的是view中设置的label

{{ form.xx }}  生成内容控件,比如一个textarea控件

{{form.xx.label}}  只生成form的label,不生成<label>标签

{{form.xx.value}}  显示字段的值

甚至还可以使用:

    {{ form.as_table }}      will render them as table cells wrapped in <tr> tags     {{ form.as_p }}             will render them wrapped in <p> tags     {{ form.as_ul }}            will render them wrapped in <li> tags

来一鼓作气的生成一个很呆萌的form。

3.2 自定义

当然,我们也可以完全手工或者半手工构造这个form 的templates。建议保留form.XXX.errors这个标签。

<input id="id_title" style='width:100%;margin-bottom:5px;' placeholder="标题"
  name="title" type="text"
  value="{{form.title.value|default_if_none:''}}" />
{{ form.title.errors }}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

Python小工具:3秒钟将视频转换为音频

最近,有读者微信上私聊我,想让我写一篇视频批量转换成音频的文章,我答应了,周末宅家里把这个小工具做出来了。

13810
来自专栏HACK学习

一个5K RMB奖励的SRC漏洞

在挖一些SRC漏洞的时候需要时刻保持敏感的状态,特别是在企业上线新业务,或者一些新漏洞爆发的时候,这些新漏洞可能是官方都未提供补丁的0day,或者刚被公布细节的...

12020
来自专栏猴子聊数据分析

如何学习和评价《利用python进行数据分析》这本书?

​这本书几乎是数据分析入门必读书了。主要介绍了python3个库numpy(数组),pandas(数据分析)和matplotlib(绘图)的学习。

10120
来自专栏TeamsSix的网络空间安全专栏

Python Threading 学习笔记 | 5、不一定有效率GIL

GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。

7140
来自专栏java思维导图

Java 中的 String 真的是不可变吗?

我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。

7820
来自专栏机器之心

四种高性能数据类型,Python collections助你优化代码、简洁任务

Python 的最大优势之一就是它有各种各样的模块和软件包可供选择。这些模块和包将 Python 的功能扩展到了许多流行领域,包括机器学习、数据科学、Web 开...

6320
来自专栏Python疯子

pyecharts的V1.5绘画优美地图<一>

​版本: pyecharts 分为 v0.5.X 和 v1 两个大版本,v0.5.X 和 v1 间不兼容,v1 是一个全新的版本

20610
来自专栏机器之心

从Python代码到APP,你只需要一个小工具:GitHub已超3000星

GitHub地址:https://github.com/streamlit/streamlit/

13630
来自专栏Crossin的编程教室

用python写一个简单的贪吃蛇游戏

Python 虽然并不是一个“为游戏而生”的语言,但也有着自己的游戏引擎。最常用的就是 pygame。另外还有一个知名游戏引擎 cocos2d,它的最初版本就是...

15610
来自专栏cwl_Java

ElasticSearch(7.2.2)-常⻅的字段类型

7520

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励