froms怎么用,为什么要用forms?目前我还没有看到它的优点,可能对做前端的同学来说比较好用吧,我在使用过程中觉得真的是挺麻烦的,本来用html直接写的,写前端还是传值都很直观。改用forms之后,真是老费神了。

1、forms是什么?

如果用户访问网站有输入信息的需求,django提供了forms类,包含了很多工具和库。

<form>...</form>之间包含一些元素,比如输入框,选择框等,通过submit将这些输入信息提交给服务器。

输入<input>有几种类型,比如  type="text"  是文本, type="password"  是密码,输入的时候不显示文本,还有邮箱等类别。django提供的这些组件还包含了一些隐藏信息,比如长度要求是多少,是不是必须填写的字段等。

2、forms有两种数据提交方式,POST和GET

POST加密传输数据到服务器,如果提交的数据会更改数据库,需要使用POST

GET 在域名上会有显示,比如www.website.com?page=1,GET一般用于不会更改系统状态的情况,因为是明文传数据,所以密码、量大的数据都不适合GET。

3、django提供的forms

处理表单非常麻烦,回传数据、要验证数据合理性、写html等,django提供了3部分工作用来减轻这些工作:

  • 准备并重构数据,适合于页面展示。
  • 为数据提供HTML表单。
  • 从用户那里接收、处理数据。
4、Form类

model对应数据库,非常方便,和model很相似,Form类对应一个表中的 <input>

ModelForm  对应model中的值,同时通过Form对应到input,在通过django自带的user做更新用户信息的时候,用的就是ModelForm。

当我们在view里面处理model实例的时候,数据从数据库中取了出来。

当我们在view里面处理表格的时候,也需要Form实例。

django提供了 {% csrf_token %},是防止跨站请求伪造攻击的,在表单里里面需要添加。

5、构造一个表单

通过post提交一个表单,

<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

这种表单加上bootstrap还是可以使用的,但是想要一些更高级的功能,比如判断用户输入的值有没有问题、名字是否合法等,就需要大量的工作了。这个时候django可以帮你搞定。

1)新建一个forms.py

templates/forms.py

from django import forms

class NameForm(forms.Form):
	your_name = forms.CharField(label='Your name', max_length=100)
	your_phone = forms.CharField(max_length=100)
	message = forms.CharField(widget=forms.Textarea)
	sender = forms.EmailField()
	cc_myself = forms.BooleanField(required=False)

label是标签名,如果不设置的话系统会默认给一个名字,max_length限定文本框长度最大100字节。

CharField默认的widget是  TextInput  ,对应生成 <input type="text">  ,改为forms.Textarea

Form实例有一个方法,is_valid(),用来判断表格数据是否合法。调用该方法后,返回True,把form的数据存入 cleaned_data 

通过form.py中的NameForm类,django帮忙生成的html如下:

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required>

2)在view中处理表单

from templates.forms import *

def get_name(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return redirect('dashboard')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    return render(request, 'accounts/dashboard.html', {'form': form})

第一次访问这个网页的时候,不用POST,所以建立一个空的NameForm(),传递到页面。

如果用户提交数据,使用POST,就用POST绑定到form。

如果form 合法,就把数据存入 cleaned_data ,再进行数据库存储等操作。

如果form不合法,就带着form的值返回页面,让用户可以进行数据修改,修改后再提交。

3)在templates中定义表单格式


    <form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
    </form>

所有的表单都合法了 is_valid() ,就存入 form.cleaned_data 

e.g.如何使用cleaned_data:

from django.core.mail import send_mail

if form.is_valid():
    subject = form.cleaned_data['subject']
    message = form.cleaned_data['message']
    sender = form.cleaned_data['sender']
    cc_myself = form.cleaned_data['cc_myself']

    recipients = ['[email protected]']
    if cc_myself:
        recipients.append(sender)

    send_mail(subject, message, sender, recipients)
    return HttpResponseRedirect('/thanks/')

需要注意的一点是:上传文件是通过FILE,而不是POST

6、form的类型
  • {{ form.as_table }} 用的是 <tr> 标签包裹输入框
  • {{ form.as_p }} 用的是 <p> 标签包裹输入框
  • {{ form.as_ul }} 用的是 <li> 标签包裹输入框

django自动给输入框加id_xxx

<form action="" method="post">
    <input type="hidden" name="csrfmiddlewaretoken" value="EgEf7yFT8CIiclWmfQ3kJOSTss3CIKKALMHDzGJ6LPhg3Qx5Y2dIh3OrxuZ514Iw">
    <label for="id_your_name">Your name:</label><input type="text" name="your_name" maxlength="100" required="" id="id_your_name">
<label for="id_your_phone">Your phone:</label><input type="text" name="your_phone" maxlength="100" required="" id="id_your_phone">
<label for="id_message">Message:</label><textarea name="message" cols="40" rows="10" required="" id="id_message"></textarea>
<label for="id_sender">Sender:</label><input type="email" name="sender" required="" id="id_sender">
<label for="id_cc_myself">Cc myself:</label><input type="checkbox" name="cc_myself" id="id_cc_myself">
    <input type="submit" value="Submit">
  </form>

7、写了{{form}},django自动帮你填充html,如果想要自定义呢?用bootstrap定义css。

语法为  {{ form.name_of_field }},

    <form action="" method="post">
    {% csrf_token %}
    {{ form.non_field_errors }}
    <div class="form-group">
    <label for="yourname">your name</label>
     {{ form.your_name.errors }}
    <input type="text" class="form-control" id="yournameId" name="yourname" value="{{form.your_name.values}}">
    </div>

    <div class="form-group">
    <label for="{{ form.email.id_for_label }}">email</label>
     {{ form.email.errors }}
    <input type="url" class="form-control" id="emailID" name="email" value="{{form.sender.values}}">
    </div>
    <input type="submit" value="Submit">
  </form>
8、展示 错误列表信息
{% if form.email.errors %}
    <ol>
    {% for error in form.email.errors %}
        <li><strong>{{ error|escape }}</strong></li>
    {% endfor %}
    </ol>
{% endif %}
9、循环显示form的值
    <form action="" method="post">
    {% csrf_token %}

{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
        {% if field.help_text %}
        <p class="help">{{ field.help_text|safe }}</p>
        {% endif %}
    </div>
{% endfor %}

    </div>
    <input type="submit" value="Submit">
  </form>
10、隐藏的属性
{# Include the hidden fields #}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{# Include the visible fields #}
{% for field in form.visible_fields %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}
11、重用模板

写了form的循环输出,想在其他页面继续使用。降低代码量

# In your form template:
{% include "form_snippet.html" %}

# In form_snippet.html:
{% for field in form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
{% endfor %}

传递form变量comment_form

{% include "form_snippet.html" with form=comment_form %}

field的属性值有哪些:

{{ field.label }} e.g. Email address.

{{ field.label_tag }}

{{ field.id_for_label }}

{{ field.value }} e.g [email protected].

{{ field.html_name }} name

{{ field.errors }}

{{ field.help_text }}

{{ field.is_hidden }}

{{ field.field }} , e.g. {{ char_field.field.max_length }}.

如何使用modelForm

https://docs.djangoproject.com/en/3.0/topics/forms/


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!



0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注