Django(七)緩存、信號、Form

大綱

1、緩存
1.一、五種緩存配置
1.2配置
2.一、三種應用(全局、視圖函數、模板)
2.2 應用多個緩存時生效的優先級
2、信號
一、Django內置信號
二、自定義信號
3、Form
一、初始form,建立form
二、自定製form錯誤信息,前端顯示
三、保留上一次提交的數據,自動生成html標籤
四、更簡潔的html標籤生成方法
五、自定義樣式
六、form 內置字段
經常使用選擇插件
七、初始化操做html

1、緩存

除了Django這個web框架以外、其餘框架都沒有緩存。Django的配置一下就可使用。前端

1.一、五種緩存配置

Django中提供了5種緩存方式:python

  • 開發調試(緩存哪裏都不放,只都配置好,測試用)
  • 內存
  • 文件
  • 數據庫
  • Memcache緩存
    • (使用 python-memcached模塊 鏈接memcache)
    • (使用 pylibmc模塊 鏈接memcache)

1.2配置

  • 開發調試
# 此爲開始調試用,實際內部不作任何操做
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.dummy.DummyCache',     # 引擎
                'TIMEOUT': 300,           # 緩存超時時間(默認300,None表示永不過時,0表示當即過時)
                'OPTIONS':{
                    'MAX_ENTRIES': 300,   # 最大緩存個數(默認300)
                    'CULL_FREQUENCY': 3,  # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認剔除1/3)
                },
                'KEY_PREFIX': '',         # 緩存key的前綴(默認空)
                'VERSION': 1,             # 緩存key的版本(默認1)
                'KEY_FUNCTION' 函數名     # 生成key的函數(默認函數會生成爲:【前綴:版本:key】)
            }
        }

    # 自定義key 名
    def default_key_func(key, key_prefix, version):
        """
        Default function to generate keys.

        Constructs the key used by all other methods. By default it prepends
        the `key_prefix'. KEY_FUNCTION can be used to specify an alternate
        function with custom key making behavior.
        """
        return '%s:%s:%s' % (key_prefix, version, key)

    def get_key_func(key_func):
        """
        Function to decide which key function to use.

        Defaults to ``default_key_func``.
        """
        if key_func is not None:
            if callable(key_func):
                return key_func
            else:
                return import_string(key_func)
        return default_key_func

 

  • 內存
# 此緩存將內容保存至內存的變量中
      # 配置:
          CACHES = {
              'default': {
                  'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
                  'LOCATION': 'unique-snowflake',
              }
          }

      # 注:其餘配置同開發調試版本

 

  • 文件
# 此緩存將內容保存至文件
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
                'LOCATION': '/var/tmp/django_cache',
                # 'LOCATION': os.path.join(BASE_DIR,'cache'),
            }
        }
    # 注:其餘配置同開發調試版本

 

  • 數據庫
# 此緩存將內容保存至數據庫
    # 配置:
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
                'LOCATION': 'my_cache_table', # 數據庫表
            }
        }
    # 注:執行建立表命令 python manage.py createcachetable

 

  • Memcache緩存(python-memcached模塊)
# 此緩存使用python-memcached模塊鏈接memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
    CACHES = {  # 鏈接本地cookie
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': 'unix:/tmp/memcached.sock',
        }
    }   
    # 能夠配置多個,鏈接多個memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
                # ('172.19.26.240:11211',10)  調權重
                # ('172.19.26.242:11211',11)  調權重,memcache模塊實現的
            ]
        }
    }

 

  • Memcache緩存(pylibmc模塊)
# 此緩存使用pylibmc模塊鏈接memcache
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '127.0.0.1:11211',
        }
    }
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': '/tmp/memcached.sock',
        }
    }   
    CACHES = {
        'default': {
            'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
            'LOCATION': [
                '172.19.26.240:11211',
                '172.19.26.242:11211',
            ]
        }
    }

 

2.一、三種應用(全局、視圖函數、模板)

緩存配置示例(文件方式)mysql

settings.pygit

# 這裏在文件末尾處添加。並新建文件夾 cache
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR,'cache'),
    }
}

 

urls.py url(r'^cache/$', views.cache),web

  • 單獨視圖緩存 (views函數緩存)*
 # 方式一:
        from django.views.decorators.cache import cache_page

        @cache_page(60 * 15)  # 15分鐘
        def my_view(request):
            ...

   # 方式二:
        from django.views.decorators.cache import cache_page

        urlpatterns = [
            url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
        ]

 

  • 局部視圖使用 (模板局部緩存)
 # a. 引入TemplateTag

        {% load cache %}

   # b. 使用緩存

        {% cache 5000 緩存key %}
            緩存內容
        {% endcache %}

 

示例:正則表達式

views.pysql

from django.views.decorators.cache import cache_page
# @cache_page(10)    views函數緩存
def cache(request):
    import time
    ctime = time.time()
    return render(request, 'cache.html', {'ctime': ctime})

 

cache.html數據庫

{% load cache %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>{{ ctime }}</h1>
    <h1>{{ ctime }}</h1>

     {% cache 10 c1 %}      <!--模板局部緩存-->
        <h1>{{ ctime }}</h1>
     {% endcache %}
</body>
</html>

 

  • 全站使用

例如 博客等緩存,經過中間件實現全站緩存。django

加緩存中間件,那麼多中間件加在什麼位置?

請求時:緩存加在中間件裏的最後一個,好比一次通過一、二、三、4中間件,加在4

返回事:緩存加在中間件裏的第一個,如上返回依次通過四、三、二、1,加在1

django 中,導入模塊,能夠實現。

# 使用中間件,通過一系列的認證等操做,
# 若是內容在緩存中存在,則使用FetchFromCacheMiddleware獲取內容並返回給用戶,
# 當返回給用戶以前,判斷緩存中是否已經存在,
# 若是不存在則UpdateCacheMiddleware會將緩存保存至緩存,從而實現全站緩存
 MIDDLEWARE = [
        'django.middleware.cache.UpdateCacheMiddleware',  # 只有process_response
        # 其餘中間件...
        'django.middleware.cache.FetchFromCacheMiddleware',  # 只有process_view
    ]

    CACHE_MIDDLEWARE_ALIAS = ""
    CACHE_MIDDLEWARE_SECONDS = ""
    CACHE_MIDDLEWARE_KEY_PREFIX = ""

 

2.2 應用多個緩存時生效的優先級

另外:session引擎緩存配置,就是放在這裏的緩存裏。

若是同時應用了兩個級別的緩存,好比views緩存和模板局部緩存,哪一個生效?

哪一個生效,和請求的聲明週期的有關係的

因此最早生效的是全站、以後views、最後模板局部緩存。

2、信號

Django中提供了「信號調度」,用於在框架執行操做時解耦。通俗來說,就是一些動做發生的時候,信號容許特定的發送者去提醒一些接受者。

好比在數據庫操做,插入一條數據以前和以後都寫入日誌。

這裏裝飾器就實現不了了,裝飾器用在函數上,這裏可能在一條代碼先後,並且是每次。

Django是很是牛逼的框架,在不少地方都放置了鉤子。咱們調用鉤子就能夠了。

咱們能夠在信號裏面註冊不少個函數。觸發信號時,會把信號裏的函數執行一遍。

一、Django內置信號

# Model signals
/    pre_init                # django的modal執行其構造方法前,自動觸發
\    post_init               # django的modal執行其構造方法後,自動觸發
/    pre_save                # django的modal對象保存前,自動觸發
\    post_save               # django的modal對象保存後,自動觸發
/    pre_delete              # django的modal對象刪除前,自動觸發
\    post_delete             # django的modal對象刪除後,自動觸發
    m2m_changed              # django的modal中使用m2m字段操做第三張表(add,remove,clear)先後,自動觸發
    class_prepared           # 程序啓動時,檢測已註冊的app中modal類,對於每個類,自動觸發
# Management signals
    pre_migrate              # 執行migrate命令前,自動觸發
    post_migrate             # 執行migrate命令後,自動觸發
# Request/response signals
    request_started          # 請求到來前,自動觸發
    request_finished         # 請求結束後,自動觸發
    got_request_exception    # 請求異常後,自動觸發
# Test signals
    setting_changed          # 使用test測試修改配置文件時,自動觸發
    template_rendered        # 使用test測試渲染模板時,自動觸發
# Database Wrappers
    connection_created       # 建立數據庫鏈接時,自動觸發

 

對於Django內置的信號,僅需註冊指定信號,當程序執行相應操做時,自動觸發註冊函數:

   from django.core.signals import request_finished
    from django.core.signals import request_started
    from django.core.signals import got_request_exception

    from django.db.models.signals import class_prepared
    from django.db.models.signals import pre_init, post_init
    from django.db.models.signals import pre_save, post_save
    from django.db.models.signals import pre_delete, post_delete
    from django.db.models.signals import m2m_changed
    from django.db.models.signals import pre_migrate, post_migrate

    from django.test.signals import setting_changed
    from django.test.signals import template_rendered

    from django.db.backends.signals import connection_created

    def func1(sender, **kwargs):
        print("xxoo_callback")
        # print(sender,kwargs)  兩個參數會把內容傳遞給信號

    xxoo.connect(func1)  # 信號註冊函數func1。xxoo指上述導入的信號

 

from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
    print("Request finished!")

 

如上的代碼文件,如何被調用執行呢?

能夠在project下的同名目錄下__init__.py裏導入這個文件,這樣一運行就自動註冊了

二、自定義信號

  • 定義信號
import django.dispatch
sg_name = django.dispatch.Signal(providing_args=["toppings", "size"])  # 觸發信號至少要傳兩個參數

 

  • 註冊信號
def callback(sender, **kwargs):
    print("callback")
    print(sender,kwargs)

sg_name.connect(callback)

 

  • 觸發信號
from 路徑 import sg_name

sg_name.send(sender='發送者隨便填',toppings=123, size=456)

 

因爲內置信號的觸發者已經集成到Django中,因此其會自動調用,而對於自定義信號則須要開發者在任意位置觸發。

好比對系統狀態閥值設置,到達某個狀態,觸發信號。

這樣只註冊信號就能夠,相似插拔式,下降程序耦合。

3、Form

django中的Form功能操做:

  • 驗證用戶請求

  • 生成HTML標籤

    (保留上一次提交的數據)

好比用戶註冊信息驗證:用戶名不容許爲空、密碼最短6位,若是本身寫 須要寫不少,比較麻煩,而Django form提供了特別便捷的實現方式

Form表單驗證模板模板是一個類,建立以下:

一、初始form,建立form

views.py

from django import forms
class FM(forms.Form):
    # 只關心處理本身定義的form表單數據,惡意攻擊定義的數據不處理
    user = forms.CharField()
    pwd = forms.CharField()  # 這裏的變量名必須和html form裏的name保持一致
    email = forms.EmailField()

def fm(request):
    if request.method == "GET":
        return render(request, "fm.html")
    elif request.method == "POST":
        # 獲取用戶全部數據,每條數據請求的驗證
        # 成功 --> 獲取全部的正確信息;失敗 --> 顯示錯誤信息
        obj = FM(request.POST)
        r1 = obj.is_valid()
        if r1:  # 返回的正確信息
            print(obj.cleaned_data)
        else:   # 返回的錯誤信息
            print(obj.errors)
            print(obj.errors.as_json())
        return redirect('/fm/')

 

fm.html

<body>
    <form action="/fm/" method="POST">
        {% csrf_token %}
        <input type="text" name="user">
        <input type="text" name="pwd">
        <input type="text" name="email">
        <input type="submit" value="提交" />
    </form>
</body>

 

錯誤提示以下:

<ul class="errorlist"><li>email<ul class="errorlist"><li>This field is required.</li></ul></li><li>pwd<ul class="errorlist"><li>This field is required.</li></ul></li><li>user<ul class="errorlist"><li>This field is required.</li></ul></li></ul> 
{"email": [{"message": "This field is required.", "code": "required"}], "pwd": [{"message": "This field is required.", "code": "required"}], "user": [{"message": "This field is required.", "code": "required"}]}

 

上面的錯誤信息爲英文,能不能自定製呢?

二、自定製form錯誤信息,前端顯示

views.py

from django import forms
class FM(forms.Form):
    # 只關心處理本身定義的form表單數據,惡意攻擊定義的數據不處理
    user = forms.CharField(error_messages={'required':'用戶名不能爲空'})
    pwd = forms.CharField(
        max_length=12,
        min_length=6,
        error_messages={'required':'密碼不能爲空','min_length':'密碼長度不能小於6','max_length':'密碼長度不能大於12'}
    )
    email = forms.EmailField(error_messages={'required':'用戶名不能爲空','invalid':'郵箱格式錯誤'})

def fm(request):
    if request.method == "GET":
        return render(request, "fm.html")
    elif request.method == "POST":
        obj = FM(request.POST)
        r1 = obj.is_valid()
        if r1:  # 返回的正確信息
            print(obj.cleaned_data)
        else:   # 返回的錯誤信息
            # ErrorDict
            # print(obj.errors['user'][0])
            # print(obj.errors.as_json())
            return render(request,'fm.html',{'obj':obj})
        return render(request,'fm.html')

 

fm.html

 <form action="/fm/" method="POST">
        {% csrf_token %}
        <p><input type="text" name="user"> {{ obj.errors.user.0 }}</p>
        <p><input type="text" name="pwd"> {{ obj.errors.pwd.0 }}</p>
        <p><input type="text" name="email"> {{ obj.errors.email.0 }}</p>
        <input type="submit" value="提交" />
    </form>

 

三、保留上一次提交的數據,自動生成html標籤

views裏面不只能幫咱們生成錯誤信息,還能幫咱們生成html標籤。

fm.html

 <form action="/fm/" method="POST">
        {% csrf_token %}
        <p>{{ obj.user }} {{ obj.errors.user.0 }}</p>
        <p>{{ obj.pwd }} {{ obj.errors.pwd.0 }}</p>
        <p>{{ obj.email }} {{ obj.errors.email.0 }}</p>
        <input type="submit" value="提交" />
    </form>

 

views.py

def fm(request):
    if request.method == "GET":
        obj = FM()  # 自動生成html時,get這裏也須要建立對象
        return render(request, "fm.html",{'obj':obj})
    elif request.method == "POST":
        obj = FM(request.POST)
        r1 = obj.is_valid()
        if r1:  # 返回的正確信息
            print(obj.cleaned_data)  # 這是個字典,註冊直接下面那一句就成功了
            # models.UserInfo.objects.create(**obj.cleaned_data)
        else:   # 返回的錯誤信息
            return render(request,'fm.html',{'obj':obj})
        return render(request,'fm.html')

 

四、更簡潔的html標籤生成方法

這裏生成雖然方便,可是可定製化不如上面高。

  • obj.as_p
  • obj.as_ul
  • obj.as_table

能夠把上面html裏的form改成:

 <form action="/fm/" method="POST">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="submit" value="提交" />
    </form>

 

<form action="/fm/" method="POST">
        {% csrf_token %}
        {{ obj.as_ul }}
        <input type="submit" value="提交" />
    </form>

 

<form action="/fm/" method="POST">
        {% csrf_token %}
        <table>
            {{ obj.as_table }}
        </table>  
        <input type="submit" value="提交" />
    </form>

 

五、自定義樣式

form類裏面的字段,只有一個功能,就是驗證客戶端發過來的數據。生成html的功能作不了。

可是怎麼生成的html標籤呢,在charfield裏面有個插件,插件生成的。在其源碼裏作了html字符串的拼接返回。

from django import forms
from django.forms import widgets  # 插件在這裏面
class FM(forms.Form):
    # 字段自己只作驗證
    user = forms.CharField(         # 修改html標籤,並指定樣式##############
        error_messages={'required':'用戶名不能爲空'},
        widget=widgets.Textarea(attrs={'class':'c1'}),  # 頁面再看就是textarea了
        label="用戶名"
    )
    pwd = forms.CharField(
        max_length=12,
        min_length=6,
        error_messages={'required':'密碼不能爲空','min_length':'密碼長度不能小於6','max_length':'密碼長度不能大於12'},
        widget=widgets.PasswordInput  # 密碼密文顯示,若是自定義樣式也可加上(attrs……)
    )
    email = forms.EmailField(error_messages={'required':'用戶名不能爲空','invalid':'郵箱格式錯誤'})

 

而字段都在from django.forms import fields裏面,因此上面的forms能夠改用fields

email = fields.EmailField()

前端<p>{{ obj.user.label }}{{ obj.user }} {{ obj.errors.user.0 }}</p>

插件裏面input、checkbox、select、redio等所有都有

六、form 內置字段

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類型

 

...

說一下上面的ChoiceField,它主要作選項用的

city = fields.ChoiceField(
        choices=[(0,'上海'),(1,'廣州')]
    )
    city2 = fields.MultipleChoiceField(
        choices=[(0,'上海'),(1,'廣州')]
    )

 

經常使用選擇插件

# 單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
# )

 

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

 


自定義
    -- 字段(校驗)
    - 插件(生成HTML)

 

七、初始化操做

在Web應用程序中開發編寫功能時,時經常使用到獲取數據庫中的數據並將值初始化在HTML中的標籤上。

def fm(request):
    if request.method == "GET":
        dic = {
            "user":'r1',
            "pwd":'123456',
            "email":'aera@11.com',
            "city":1,
            "city2":[1,2],
        }
        obj = FM(initial=dic)  # 初始化
        return render(request, "fm.html",{'obj':obj})
    # ……

 


轉載請務必保留此出處:http://www.cnblogs.com/lgeng/articles/7366204.html

 

<!-- END  -->

 

 

 

 

 

《版本說明》: 本文轉自 -- http://blog.csdn.net/fgf00/article/details/54319791

相關文章
相關標籤/搜索