1. 程式人生 > >Django--Form組件

Django--Form組件

可用 strong per cts choices log 性別 ati 有一個

一 . Form介紹

我們之前一下用form表單向後臺提交數據, 裏面寫的是input標簽. 我們在好多場景下需要對用戶輸入的內容進行校驗,比如說註冊信息.
Django form組件就實現了上述的功能
form組件主要功能:
    生成頁面可用HTML標簽
    對用戶提交的數據進行校驗
    保留上次輸入的內容

  使用form組件實現註冊功能

# views.py文件
from django import forms

# 按照Django form組件的要求自己寫一個類
class RegForm(forms.Form):
    username 
= forms.CharField(label="用戶名") # 括號裏面寫一些校驗規則,下面會介紹 password = forms.CharField(label="密碼") #
類屬性名字是什麽,前端標簽裏面的name值就是什麽, 現在的類屬性就好比input標簽裏面的name=username,name=password

  在寫一個視圖函數

def register(request):
    form_obj = RegForm()
    # print(request.POST)
    if request.method == "POST":
        
# 實例化form對象的時候, 把post提交過來的數據直接傳進去 form_obj = RegForm(data=request.POST) # 就好比request.POST.get(‘username‘) request.POST.get(‘password‘) # print(form_obj.is_valid()) # 如果用戶輸入的有一個錯誤就是False,全對才是True if form_obj.is_valid(): print(form_obj.cleaned_data) # 打印用戶輸入對的數據 這個清洗後的數據必須寫在is_valid後面
# else: # print(form_obj.errors.as_data()) # 拿錯誤信息 return render(request, register.html, {form_obj:form_obj}) else: return render(request, register.html, {form_obj: form_obj})

  register.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--bootstrap-->
    <link href="{% static ‘bootstrap/css/bootstrap.min.css‘ %}" rel="stylesheet">

</head>
<body>
<form action="{% url ‘register‘ %}" method="post" novalidate>
    {% csrf_token %}
{#                <p>{{ form_obj.as_p }}</p>#}   <!--拿所有的標簽-->
        <p>
            {{ form_obj.username.label }}
            {{ form_obj.username }}
            <span style="color: red">
                {{ form_obj.username.errors.0 }}  <!--拿錯誤信息,errors拿到的是列表.所以用索引-->
            </span>

        </p>
        <p>
            {{ form_obj.password.label }}
            {{ form_obj.password }}
            <span style="color: red">
                {{ form_obj.password.errors.0 }}
            </span>

        </p>
        <p>
            {{ form_obj.re_password.label }}
            {{ form_obj.re_password }}
            {{ form_obj.re_password.errors.0 }}
        </p>
        <p>
            {{ form_obj.userinfo.label }}  <!--由於是標簽所以想要顯示作者名字不能直接.name 要在models裏面寫def__str__(self)-->
            {{ form_obj.userinfo }}
            {{ form_obj.userinfo.errors.0 }}
        </p>
    <button class="btn btn-primary btn-lg btn-block">註 冊</button>
</form>
</body>
</html>

二 . form表單的常用字段插件

  initial

class LoginForm(forms.Form):
    username = forms.CharField(  
        min_length=8,
        label="用戶名",
        initial="張三"  # 設置默認值
    )
    pwd = forms.CharField(min_length=6, label="密碼")

  error_messages(重寫錯誤信息)

class LoginForm(forms.Form):
    username = forms.CharField(
        min_length=8,
        label="用戶名",
        initial="張三",
        error_messages={
            "required": "不能為空",
            "invalid": "格式錯誤",
            "min_length": "用戶名最短8位"
        }
    )

  password

class LoginForm(forms.Form):
    ...
    pwd = forms.CharField(
        min_length=6,
        label="密碼",
        widget=forms.PasswordInput(attrs={class: c1}, render_value=True)
    )   # 讓密碼變成密文
# attrs裏面可以設置bootstrap樣式   

  RadioSelect

class LoginForm(forms.Form):
    username = forms.CharField(  #其他選擇框或者輸入框,基本都是在這個CharField的基礎上通過插件來搞的
        min_length=8,
        label="用戶名",
        initial="張三",
        error_messages={
            "required": "不能為空",
            "invalid": "格式錯誤",
            "min_length": "用戶名最短8位"
        }
    )
    pwd = forms.CharField(min_length=6, label="密碼")
    gender = forms.fields.ChoiceField(
        choices=((1, ""), (2, ""), (3, "保密")),
        label="性別",
        initial=3,
        widget=forms.RadioSelect()  # 後面括號寫不行都行
    )

  單選Select

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.ChoiceField(
        choices=((1, "籃球"), (2, "足球"), (3, "雙色球"), ),
        label="愛好",
        initial=3,
        widget=forms.Select
    )

  單選checkbox

class LoginForm(forms.Form):
    ...
    keep = forms.fields.ChoiceField(
        label="是否記住密碼",
        initial="checked",
        widget=forms.CheckboxInput
    )

  多選checkbox

class LoginForm(forms.Form):
    ...
    hobby = forms.fields.MultipleChoiceField(
        choices=((1, "籃球"), (2, "足球"), (3, "雙色球"),),
        label="愛好",
        initial=[1, 3],
        widget=forms.widgets.CheckboxSelectMultiple
    )

  choice字段註意事項

    在選擇標簽時, 需要註意choice的選項可以從數據庫中拿, 但是由於是靜態字段, 獲取的值無法實時更新, 需要重寫構造方法從而實現choice實時更新

  方式一

from django.forms import Form
from django.forms import widgets
from django.forms import fields

class MyForm(Form):
 
    user = fields.ChoiceField(
        # choices=((1, ‘上海‘), (2, ‘北京‘),),
        initial=2,
        widget=widgets.Select
    )
 
    def __init__(self, *args, **kwargs):
        super(MyForm,self).__init__(*args, **kwargs)
        # self.fields[‘user‘].choices = ((1, ‘上海‘), (2, ‘北京‘),)
        #
        self.fields[user].choices = models.Classes.objects.all().values_list(id,caption)

  方式二

from django import forms
from django.forms import fields
from django.forms import models as form_model

class FInfo(forms.Form):
    authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())  # 多選
    # authors = form_model.ModelChoiceField(queryset=models.NNewType.objects.all())  # 單選

三 . Form所有內置字段

Django--Form組件