Django-modelform

數據庫choice

class UserInfo(AbstractUser):
    gender=models.IntegerField(choices=((1,''),(2,''),default=1)

查詢html

UserInfo.objects.get(pk=1).get_gender_display()

modelform使用

創建一張表前端

class Book(models.Model):
    nid=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)             
    price=models.DecimalField(max_digits=8,decimal_places=2)                 
    pub_date=models.DateTimeField()  # "2012-12-12"  
publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) # 級聯刪除

authors=models.ManyToManyField(to="Author")

      def __str__(self):
          return self.titlegit

 

構建modelform

class BookModelForm(forms.ModelForm):
    class Meta:
        model=Book
        fields ="__all__"
#首先導入ModelForm

from django.forms import ModelForm
#在視圖函數中,定義一個類,好比就叫StudentList,這個類要繼承ModelForm,在這個類中再寫一個原類Meta(規定寫法,並注意首字母是大寫的)
#在這個原類中,有如下屬性(部分):

class StudentList(ModelForm):
    class Meta:
        model =Student #對應的Model中的類
        fields = "__all__" #字段,若是是__all__,就是表示列出全部的字段
        exclude = None #排除的字段
        #error_messages用法:
        error_messages = {
        'name':{'required':"用戶名不能爲空",},
        'age':{'required':"年齡不能爲空",},
        }
        #widgets用法,好比把輸入用戶名的input框給爲Textarea
        #首先得導入模塊
        from django.forms import widgets as wid #由於重名,因此起個別名
        widgets = {
        "name":wid.Textarea(attrs={"class":"c1"}) #還能夠自定義屬性
        }
        #labels,自定義在前端顯示的名字
        labels= {
        "name":"用戶名"
        }
示例

以上面的表爲例,構建modelform等同於正則表達式

class BookForm(forms.Form):
  title=forms.CharField(max_length=32)
  price=forms.IntegerField()
  pub_date=forms.DateField(widget=widgets.TextInput(attrs={"type":"date"}))
  publish=forms.ModelChoiceField(queryset=Publish.objects.all())
  authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())數據庫

modelform邏輯

添加操做

def add(reqeust):
  if GET請求:
    form=BookModelForm()
    return render(reqeust,{"form":form})
  '''
  將數據或者錯誤信息渲染到頁面
  <form action="" method="post" novalidate>
    {% csrf_token %}
    {% for field in form %}
      <div class="form-group">
        <label for="title">{{ field.label }}</label>
        {{ field }}
        <span>{{ field.errors.0 }}</span>
        </div>
    {% endfor %}
    <input type="submit" value="提交" class="btn btn-default pull-right">
  </form>
  '''
  else POST請求:
  form=BookModelForm(request.POST)
  if form.is_valid():
    form.save() # Book.objects.create(clean_data)
    return redirect("/")
  else:
    return render(reqeust,{"form":form})django

編輯操做

def edit(request,id):
  edit_obj=Book.objects.get(pk=id)
  if GET請求:
    form=BookModelForm(instance=edit_obj)
    return render(reqeust,{"form":form})
  '''
  將數據或者錯誤信息渲染到頁面
  <form action="" method="post" novalidate>
    {% csrf_token %}
    {% for field in form %}
      <div class="form-group">
        <label for="title">{{ field.label }}</label>
        {{ field }}
        <span>{{ field.errors.0 }}</span>
        </div>
    {% endfor %}
    <input type="submit" value="提交" class="btn btn-default pull-right">
  </form>

  '''
  else POST請求:
    form=BookModelForm(request.POST,instance=edit_obj)
    if form.is_valid():
      form.save() # edit_obj.update(clean_data)
      return redirect("/")
    else:
      return render(reqeust,{"form":form})app

from django.shortcuts import render,HttpResponse,redirect
from django.forms import ModelForm
# Create your views here.
from app01 import models
def test(request):
    # model_form = models.Student
    model_form = models.Student.objects.all()
    return render(request,'test.html',{'model_form':model_form})

class StudentList(ModelForm):
    class Meta:
        model = models.Student #對應的Model中的類
        fields = "__all__" #字段,若是是__all__,就是表示列出全部的字段
        exclude = None #排除的字段
        labels = None #提示信息
        help_texts = None #幫助提示信息
        widgets = None #自定義插件
        error_messages = None #自定義錯誤信息
        #error_messages用法:
        error_messages = {
        'name':{'required':"用戶名不能爲空",},
        'age':{'required':"年齡不能爲空",},
        }
        #widgets用法,好比把輸入用戶名的input框給爲Textarea
        #首先得導入模塊
        from django.forms import widgets as wid #由於重名,因此起個別名
        widgets = {
        "name":wid.Textarea
        }
        #labels,自定義在前端顯示的名字
        labels= {
        "name":"用戶名"
        }
def student(request):
    if request.method == 'GET':
        student_list = StudentList()
        return render(request,'student.html',{'student_list':student_list})
    else:
        student_list = StudentList(request.POST)
        if student_list.is_valid():
            student_list.save()
            return render(request,'student.html',{'student_list':student_list})

def student_edit(request,pk):
    obj = models.Student.objects.filter(pk=pk).first()
    if not obj:
        return redirect('test')
    if request.method == "GET":
        student_list = StudentList(instance=obj)
        return render(request,'student_edit.html',{'student_list':student_list})
    else:
        student_list = StudentList(request.POST,instance=obj)
        if student_list.is_valid():
            student_list.save()
            return render(request,'student_edit.html',{'student_list':student_list})
示例

編輯操做與增長操做同樣都是用的save()操做,所以進行編輯操做時必定要傳入修改對象(instance=編輯對象),不然就變成增長操做了ide

Field
    required=True,               是否容許爲空
    widget=None,                 HTML插件
    label=None,                  用於生成Label標籤或顯示內容
    initial=None,                初始值
    help_text='',                幫助信息(在標籤旁邊顯示)
    error_messages=None,         錯誤信息 {'required': '不能爲空', 'invalid': '格式錯誤'}
    show_hidden_initial=False,   是否在當前插件後面再加一個隱藏的且具備默認值的插件(可用於檢驗兩次輸入是否一直)
    validators=[],               自定義驗證規則
    localize=False,              是否支持本地化
    disabled=False,              是否能夠編輯
    label_suffix=None            Label內容後綴
 
 
CharField(Field)
    max_length=None,             最大長度
    min_length=None,             最小長度
    strip=True                   是否移除用戶輸入空白
 
IntegerField(Field)
    max_value=None,              最大值
    min_value=None,              最小值
 
FloatField(IntegerField)
    ...
 
DecimalField(IntegerField)
    max_value=None,              最大值
    min_value=None,              最小值
    max_digits=None,             總長度
    decimal_places=None,         小數位長度
 
BaseTemporalField(Field)
    input_formats=None          時間格式化   
 
DateField(BaseTemporalField)    格式:2015-09-01
TimeField(BaseTemporalField)    格式:11:12
DateTimeField(BaseTemporalField)格式:2015-09-01 11:12
 
DurationField(Field)            時間間隔:%d %H:%M:%S.%f
    ...
 
RegexField(CharField)
    regex,                      自定製正則表達式
    max_length=None,            最大長度
    min_length=None,            最小長度
    error_message=None,         忽略,錯誤信息使用 error_messages={'invalid': '...'}
 
EmailField(CharField)      
    ...
 
FileField(Field)
    allow_empty_file=False     是否容許空文件
 
ImageField(FileField)      
    ...
    注:須要PIL模塊,pip3 install Pillow
    以上兩個字典使用時,須要注意兩點:
        - form表單中 enctype="multipart/form-data"
        - view函數中 obj = MyForm(request.POST, request.FILES)
 
URLField(Field)
    ...
 
 
BooleanField(Field)  
    ...
 
NullBooleanField(BooleanField)
    ...
 
ChoiceField(Field)
    ...
    choices=(),                選項,如:choices = ((0,'上海'),(1,'北京'),)
    required=True,             是否必填
    widget=None,               插件,默認select插件
    label=None,                Label內容
    initial=None,              初始值
    help_text='',              幫助提示
 
 
ModelChoiceField(ChoiceField)
    ...                        django.forms.models.ModelChoiceField
    queryset,                  # 查詢數據庫中的數據
    empty_label="---------",   # 默認空顯示內容
    to_field_name=None,        # HTML中value的值對應的字段
    limit_choices_to=None      # ModelForm中對queryset二次篩選
     
ModelMultipleChoiceField(ModelChoiceField)
    ...                        django.forms.models.ModelMultipleChoiceField
 
 
     
TypedChoiceField(ChoiceField)
    coerce = lambda val: val   對選中的值進行一次轉換
    empty_value= ''            空值的默認值
 
MultipleChoiceField(ChoiceField)
    ...
 
TypedMultipleChoiceField(MultipleChoiceField)
    coerce = lambda val: val   對選中的每個值進行一次轉換
    empty_value= ''            空值的默認值
 
ComboField(Field)
    fields=()                  使用多個驗證,以下:即驗證最大長度20,又驗證郵箱格式
                               fields.ComboField(fields=[fields.CharField(max_length=20), fields.EmailField(),])
 
MultiValueField(Field)
    PS: 抽象類,子類中能夠實現聚合多個字典去匹配一個值,要配合MultiWidget使用
 
SplitDateTimeField(MultiValueField)
    input_date_formats=None,   格式列表:['%Y--%m--%d', '%m%d/%Y', '%m/%d/%y']
    input_time_formats=None    格式列表:['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']
 
FilePathField(ChoiceField)     文件選項,目錄下文件顯示在頁面中
    path,                      文件夾路徑
    match=None,                正則匹配
    recursive=False,           遞歸下面的文件夾
    allow_files=True,          容許文件
    allow_folders=False,       容許文件夾
    required=True,
    widget=None,
    label=None,
    initial=None,
    help_text=''
 
GenericIPAddressField
    protocol='both',           both,ipv4,ipv6支持的IP格式
    unpack_ipv4=False          解析ipv4地址,若是是::ffff:192.0.2.1時候,可解析爲192.0.2.1, PS:protocol必須爲both才能啓用
 
SlugField(CharField)           數字,字母,下劃線,減號(連字符)
    ...
 
UUIDField(CharField)           uuid類型
    ...
Django內置字段
TextInput(Input)
NumberInput(TextInput)
EmailInput(TextInput)
URLInput(TextInput)
PasswordInput(TextInput)
HiddenInput(TextInput)
Textarea(Widget)
DateInput(DateTimeBaseInput)
DateTimeInput(DateTimeBaseInput)
TimeInput(DateTimeBaseInput)
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
FileInput
ClearableFileInput
MultipleHiddenInput
SplitDateTimeWidget
SplitHiddenDateTimeWidget
SelectDateWidget
Django內置插件
# 單radio,值爲字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.RadioSelect(choices=((1,'上海'),(2,'北京'),))
# )
 
# 單radio,值爲字符串
# user = fields.ChoiceField(
#     choices=((1, '上海'), (2, '北京'),),
#     initial=2,
#     widget=widgets.RadioSelect
# )
 
# 單select,值爲字符串
# user = fields.CharField(
#     initial=2,
#     widget=widgets.Select(choices=((1,'上海'),(2,'北京'),))
# )
 
# 單select,值爲字符串
# user = fields.ChoiceField(
#     choices=((1, '上海'), (2, '北京'),),
#     initial=2,
#     widget=widgets.Select
# )
 
# 多選select,值爲列表
# user = fields.MultipleChoiceField(
#     choices=((1,'上海'),(2,'北京'),),
#     initial=[1,],
#     widget=widgets.SelectMultiple
# )
 
 
# 單checkbox
# user = fields.CharField(
#     widget=widgets.CheckboxInput()
# )
 
 
# 多選checkbox,值爲列表
# user = fields.MultipleChoiceField(
#     initial=[2, ],
#     choices=((1, '上海'), (2, '北京'),),
#     widget=widgets.CheckboxSelectMultiple
# )
經常使用選擇插件
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息