Django学習ノート(8):Djangoのフォーム(上)

24264 ワード

一、Djangoのフォーム(または同様のフォーム)
フォームは総合的で大きなラベルです.フロントエンドでもバックグラウンドでも重要です.シリーズから構成されています.
もちろんフォームのラベルを削除して、他の方法でフォームの効果を実現することができます.
参考:W 3 C:http://www.w3school.com.cn/tags/tag_form.asp
Djangoの中で、それは面に関連してもとても広くて、今いっしょにそれを学びます.
参考:Django Book:http://djangobook.py3k.cn/2.0/chapter07/
二、フォームのステップを大隊とする
まず、一連のフォームを定義したurl、view、htmlなどは以下の通りです.
1 Url:
2 #    
3 urlpatterns +=patterns('',
4     (r'^test/$','login.views.test'),#    
5     (r'^search/$','login.views.search'),#    
6 )
html:
form method="GET" action='/search/'>
<input type="text" name='name'>
<input type="text" name='age'>
<input type="submit" value="Search"> 
</form>
ここで、testビュー関数は単に参照フォームテンプレートであり、フォームを実際に処理するデータはsearchビュー関数を必要とします.テンプレートは次のように表示されます

ここでは、Djangoはどのように処理されているかを見たいです.前のセクションの知識が必要かもしれません.(リンクをクリックしてください.Django学習ノート(7):HttpRequest対象とHttpResonse対象)
ここでsearchビュー関数を書きます.
1 def search(request):
2     context={}
3     context=request.GET #      ,      HTTP GET   
4     item=[]
5     for obj in context.items():
6         item.append(obj)
7     return HttpResponse(item)   
いつも前節の勉強の知識を覚えて、request対象.ここで上に提出したデータを全部出力します.次のように表示します.
 
(u'age', u'22')(u'name', u'BeginMan')
 
すべてのデータを含む(キー、値)元のリストを返します.
上の基礎があれば、djangoの処理フォームはもっと理解できるようになります.go on!
三、簡単なフォームの判例
from django.http import HttpResponse
from django.shortcuts import render_to_response
from mysite.books.models import Book

def search(request):
    if 'q' in request.GET and request.GET['q']:
        q = request.GET['q']
        books = Book.objects.filter(title__icontains=q)
        return render_to_response('search_results.html',
            {'books': books, 'query': q})
    else:
        return HttpResponse('Please submit a search term.')
HTMLで変数qを定義しました.フォームを送信するとき、変数qの値は、GETによってURL/search/に付加される.処理/search/(search))のビューは、request.GETによってqの値を取得する.
qがrequest.GETに存在するかどうかをチェックする以外に、reuqest.GET[q’]の値が空かどうかをチェックします.
もちろんこれは健全なフォームです.改善された部分は以下の通りです.
 1 def search(request):
 2     errors=[]
 3     if 'q' in request.GET:
 4         q = request.GET['q']
 5         if not q:
 6             errors.append('      ')
 7         elif len(q)>10:
 8             errors.append('        10 ')
 9         else:
10             news = New.objects.filter(title__icontains=q)
11             return render_to_response('test/test_search_results.html',
12             {'news': news, 'query': q})
13     return render_to_response('test/form.html',{'errors':errors})
{% if errors %}
<ul>
{% for obj in errors %}
<li style="color: red;">{{obj}}</li>
{% endfor %}
</ul>
{% endif %}
<form method="GET" action='/search/'>
<input type="text" name='q'>
<input type="submit" value="Search" class="btn btn-large btn-primary"> 
</form>
  Django学习笔记(8):Django的表单(上)_第1张图片
四、Jquery Ajaxを使ってフォーム処理を実現することを考慮する.
AJAX=非同期JavaScriptとXML(Aynchronous JavaScript and XML).
簡単に言って、ホームページ全体を再ロードしない場合、AJAXはバックグラウンドを通じてデータをロードし、ホームページ上に表示します.
jQuery AJAX方法により、HTTP GetとHTTP Postを使ってリモートサーバからテキスト、HTML、XMLまたはJSONを要求することができます.これらの外部データを直接ウェブページの選択された要素にロードすることができます.使いやすいです.
jQuery load()方法はシンプルで強力なAJAX方法です.
ロード()方法はサーバからデータをロードし、返信したデータを選択された要素に入れます.
Django学习笔记(8):Django的表单(上)_第2张图片
jQuery get()とpost()の方法は、HTTP GETまたはPOSTを介してサーバからデータを要求するために使用される.
詳細な参照:http://www.w3school.com.cn/jquery/jquery_アジャクス.ゲットするpost.asp
私達のプロジェクトを続けます.
例えば私は伝言表を持っています.
 1 class Msg(models.Model):
 2     """
 3  4     ---------------------------------
 5     Coder                  
 6     ---------------------------------
 7     BeginMan     2013-04-26
 8     """
 9     title = models.CharField(u'  ',max_length=30)
10     content = models.TextField(u'  ')
11     user = models.ForeignKey(User)
12     ip = models.IPAddressField(u'IP  ',blank=True)
13     datetime = models.DateTimeField(auto_now_add=True)
14     clickcount = models.IntegerField(u'   ',default=0)
15     class Meta:
16         db_table = "Msg"
17         verbose_name = '    '
18         verbose_name_plural = '    '
19     def __unicode__(self):
20         return '  [%s]      "%s"   ' %(self.user.username,self.title)
メッセージリストのページにメッセージを追加するためのプレートを表示したいです.ここではjquery loadを使ってメッセージを追加するページを書き込みリストのページにロードします.
1    base.html    ,  css add_msg              ,            
2 $(document).ready(function(){
3     $('.add_msg').load('/msg/send_msg/');
4 })
私の伝言板urlsは以下の通りです.
1 #   
2 urlpatterns += patterns('',
3     (r'^messages/message_list/$','login.msg.msg_list_page'), #    
4     (r'^msg/detail/(?P<msg_id>\d+)/$','login.msg.msg_detail'),#    
5     (r'^msg/send_msg/$','login.views.send_msg'),#    
6 )
メッセージを追加するページレイアウトは以下の通りです.
Django学习笔记(8):Django的表单(上)_第3张图片
注意2つのbutton:を提出します.
jsは次のように書くことができます.
 1 //  jquery.min
 2 <script type="text/javascript">
 3 //    
 4 function _submit(){
 5     var title=$('input[name="title"]').val();
 6     var content=$('textarea').val();
 7     if (title==""||content==""){
 8         return alert("            !")
 9     }
10     $.post('/msg/send_msg/',{"title":title,"content":content},function(){
11         var alt=alert("    !");
12         if (!alt){
13             $('input[name="title"]').val("");
14             $('textarea').val("");
15             window.location.href=window.location.href;
16         }
17         
18     })
19 }
20 //  
21 function _reset(){
22     $('input[name="title"]').val("");
23     $('textarea').val("");
24 }
あとはビュー関数を書き始めます.
 1 def send_msg(request):
 2     context={}
 3     try:
 4         if request.method=="POST":
 5             title=request.POST.get('title','')
 6             content=request.POST.get('content','')
 7             ip=request.META['REMOTE_ADDR']  #  IP
 8             if request.user.is_authenticated():  #           
 9                 user=request.user
10             else:
11                 user=request.user   #        AnonymousUser  
12             message=Msg.objects.create(title=title,content=content,user=user,ip=ip)
13             return HttpResponse('ok')
14     except Exception,e:
15         return HttpResponse('Error:%s' %e)
16     return render_template(request,'message/add_msg.html',context)
注意してください.ここにレンデクルと書き換えました.to_レスポンスは、その代わりにレンダーなんです.templateは、apを作成し、書き換えコードを置いて、次のようにします.
#coding=utf-8
from django.template import RequestContext
from django.shortcuts import render_to_response

def render_template(request, template_path, extra_context = {}):
    c = RequestContext(request)
    c.update(extra_context)
    return render_to_response(template_path, context_instance=c)
 ログインしていないユーザーに対しては、メッセージを送ることができません.ここではテンプレートの中で「%if user.isuuthenticated%」で判定できます.ちょっと処理して、フォームを利用できない状態にしてもいいです.
Django学习笔记(8):Django的表单(上)_第4张图片
五、検証について
Javascriptを使ってクライアントブラウザでデータを検証することができます.クライアントが検証されていても、サーバー側はもう一度検証しなければなりません.一部のユーザーはJavaScriptをオフにしたり、悪意のあるユーザーが不法なデータを提出して攻撃できるかどうかを調べる試みをするからです.
前の検証は小さい部分だけです.Djangoは自分の検証を持って来ます.