Django中的Form(二)


 

一、保存用戶輸入內容

 如果用戶輸入一張表單提交后出現錯誤時,會出現重現填寫的情況。我們可以把用戶輸入的信息保存下來,並返回到前台頁面,這樣用戶就無需再次輸入。

views.py

 1 # coding:utf-8  2 from django.shortcuts import render, HttpResponse, redirect  3 from app01.forms import account as Account_Forms  4  5  6 def login(request):  7  8 obj = Account_Forms.UserInfo(request.POST) #將用戶輸入的內容添加到form的對象中  9 if request.method == 'POST': 10 return render(request, 'account/login.html', {'obj': obj}) #將用戶輸入的內容返回到前台頁面 11 return render(request, 'account/login.html', {'obj': obj})

 

forms.py

1 from django import forms 2 3 4 class UserInfo(forms.Form): 5 username = forms.CharField() 6 password = forms.CharField(widget=forms.PasswordInput())

 

html文件

 1 {% load staticfiles %}  2 <!DOCTYPE html>  3 <html lang="en">  4 <head>  5 <meta charset="UTF-8">  6 <title></title>  7 </head>  8 <body>  9 10 <form action="/login/" method="post"> 11 <p>{{ obj.username }}</p> 12 <p>{{ obj.password }}</p> 13 <input type="submit" value="submit"> 14 </form> 15 16 {#<script type="text/javascript" src="{{ STATIC_URL }}/js/jquery-2.1.4.min.js">#} 17 <script type="text/javascript" src="{% static "js/jquery-2.1.4.min.js" %}"></script> 18 </body> 19 </html>

 

二、生成動態的select

 form中可以再前端生成select,select一般會分為兩類:1、內容不變的數據。 2、從數據庫或者文件中提取的經常發生改變的數據。1的實現方法可以見django form (一)。

如果從數據庫提取數據,內容為免會經常發生增刪改的情況,如果在使用1的實現方法就很不現實,此時我們就需要一種可以實現動態select的方法了。

 先來看一段代碼,不理解也沒關系:

form中的類

 1 # coding:utf-8  2 from django import forms  3 from app01 import models  4  5  6 class ImportForm(forms.Form):  7 Host_List = (  8 (1, '物理機'),  9 (2, '虛擬機') 10  ) 11 host_type = forms.IntegerField(widget=forms.Select(choices=Host_List)) 12 hostname = forms.CharField() 13 14 admin = forms.IntegerField(widget=forms.Select()) 15 16 def __init__(self, *args, **kwargs): 17 super(ImportForm, self).__init__(*args, **kwargs) 18 19 self.fields['admin'].widget.choices = models.Simp.objects.all().values_list('id', 'username')

 上一段代碼其實就已經實現了form中動態的select功能,下面展開的select就是從數據庫中提取的數據:

 

實現的原理

我們要知道一個前提,django  form中要實現select,所傳得參數必須是一個元組類型的數據。

如果你想知道為什么,其中是怎么實現的,為什么使用1的實現方法就是不行,那就耐心的往下看原理!這一段不屬於django的知識點,屬於python面向對象的內容。

我們知道python的類中可以定義靜態字段,靜態字段在類中加載后,被放入到內存中,如果再次修改靜態字段,內存中的數據就不會在改變為什么呢?

因為靜態字段是屬於類的。
類中的靜態字段會被加載放入到內存中,屬於類里面的內容,在第一次運行程序的時候,
只加載了一次。而我們每一次創建類的對象時,默認會執行類下面的 __init__構造函數。
而靜態字段屬於類,不屬於對象,所以之后的每一次訪問時都不會再次加載類中的內容。
所以當我們修改文件中或者數據庫中與靜態字段有關聯的數據內容后,
再次訪問的時候,並不會修改內存中的數據。(除非我們把程序重啟)

 

如何做?

通過類的繼承關系我們知道,如果執行的方法在當前類下沒有,就會自動去父類中查找,如果有就會執行。

我們可以在定義的form類下重定義__init__方法。

1 def __init__(self, *args, **kwargs): 2 super(ImportForm, self).__init__(*args, **kwargs) 3 4 self.fields['admin'].widget.choices = models.Simp.objects.all().values_list('id', 'username')

 

 

第一句中的super:執行父類中的__init__方法

第二句這行代碼什么意思呢,可以往父類中查找源碼到底做了什么

查找父類中的__init__方法,可以看到self.fields = copy.deepcopy(self.base_fields)

這一句就是把form類下面的靜態字段都深copy了一份放在了對象里。這樣,我們只需要修改對象里面那份數據就可以了。而類下面的數據不需要改變。

self.fields的結果是一個字典,用['admin']就可以查找到在form類中定義的靜態字段:admin = forms.IntegerField(widget=forms.Select(choices=Host_List))

通過.widget.choices的方法就可以修改靜態字段中的參數了。

當前台頁面再次訪問時,就會拿到一份新的數據,生成了一個新元組,重新傳到前端的html頁面中。這樣就實現了動態的select。

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM