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などは以下の通りです.
ここでは、Djangoはどのように処理されているかを見たいです.前のセクションの知識が必要かもしれません.(リンクをクリックしてください.Django学習ノート(7):HttpRequest対象とHttpResonse対象)
ここでsearchビュー関数を書きます.
すべてのデータを含む(キー、値)元のリストを返します.
上の基礎があれば、djangoの処理フォームはもっと理解できるようになります.go on!
三、簡単なフォームの判例
qがrequest.GETに存在するかどうかをチェックする以外に、reuqest.GET[q’]の値が空かどうかをチェックします.
もちろんこれは健全なフォームです.改善された部分は以下の通りです.
四、Jquery Ajaxを使ってフォーム処理を実現することを考慮する.
AJAX=非同期JavaScriptとXML(Aynchronous JavaScript and XML).
簡単に言って、ホームページ全体を再ロードしない場合、AJAXはバックグラウンドを通じてデータをロードし、ホームページ上に表示します.
jQuery AJAX方法により、HTTP GetとHTTP Postを使ってリモートサーバからテキスト、HTML、XMLまたはJSONを要求することができます.これらの外部データを直接ウェブページの選択された要素にロードすることができます.使いやすいです.
jQuery load()方法はシンプルで強力なAJAX方法です.
ロード()方法はサーバからデータをロードし、返信したデータを選択された要素に入れます.
jQuery get()とpost()の方法は、HTTP GETまたはPOSTを介してサーバからデータを要求するために使用される.
詳細な参照:http://www.w3school.com.cn/jquery/jquery_アジャクス.ゲットするpost.asp
私達のプロジェクトを続けます.
例えば私は伝言表を持っています.
注意2つのbutton:を提出します.
jsは次のように書くことができます.
五、検証について
Javascriptを使ってクライアントブラウザでデータを検証することができます.クライアントが検証されていても、サーバー側はもう一度検証しなければなりません.一部のユーザーはJavaScriptをオフにしたり、悪意のあるユーザーが不法なデータを提出して攻撃できるかどうかを調べる試みをするからです.
前の検証は小さい部分だけです.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>
四、Jquery Ajaxを使ってフォーム処理を実現することを考慮する.
AJAX=非同期JavaScriptとXML(Aynchronous JavaScript and XML).
簡単に言って、ホームページ全体を再ロードしない場合、AJAXはバックグラウンドを通じてデータをロードし、ホームページ上に表示します.
jQuery AJAX方法により、HTTP GetとHTTP Postを使ってリモートサーバからテキスト、HTML、XMLまたはJSONを要求することができます.これらの外部データを直接ウェブページの選択された要素にロードすることができます.使いやすいです.
jQuery load()方法はシンプルで強力なAJAX方法です.
ロード()方法はサーバからデータをロードし、返信したデータを選択された要素に入れます.
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 )
メッセージを追加するページレイアウトは以下の通りです.注意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%」で判定できます.ちょっと処理して、フォームを利用できない状態にしてもいいです.五、検証について
Javascriptを使ってクライアントブラウザでデータを検証することができます.クライアントが検証されていても、サーバー側はもう一度検証しなければなりません.一部のユーザーはJavaScriptをオフにしたり、悪意のあるユーザーが不法なデータを提出して攻撃できるかどうかを調べる試みをするからです.
前の検証は小さい部分だけです.Djangoは自分の検証を持って来ます.