django form使用

  • 2019 年 11 月 21 日
  • 筆記

在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("rn", "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>", "rn"),                                    '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 }}