前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django form使用

django form使用

作者头像
超级大猪
发布2019-11-21 20:20:45
1K0
发布2019-11-21 20:20:45
举报
文章被收录于专栏:大猪的笔记大猪的笔记

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

1 生成form类

下面是一个典型的form类。

代码语言:javascript
复制
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后,就应该写响应代码了。

代码:

代码语言:javascript
复制
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这个标签。

代码语言:javascript
复制
<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 }}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-08-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 生成form类
  • 2 使用这个Form
  • 3 设定它的templates
    • 3.1 简单设置
      • 3.2 自定义
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档