চতুর্থ অধ্যায়
তৃতীয় অধ্যায়ে আমরা যেখানে শেষ করেছি সেখান থেকেই আমরা চতুর্থ অধ্যায় শুরু করবো । আগের অধ্যায়গুলোর বিষয়বস্তু চোখ বুলিয়ে নিলে এই অধ্যায়টি আত্মস্থ করতে সুবিধা হবে।
ওয়েব এ্যাপ্লিকেশন ডেভেলপ করতে গেলে আমাদেরকে কম বেশি ফর্ম নিয়ে কাজ করতে হয় । ফর্মের মাধ্যমে ব্যবহারকারী ইনপুট প্রদান করতে পারেন । যাদের HTML এর জ্ঞান আছে তারা ইতোমধ্যে
<form>
এর সাথে পরিচিত । জ্যাঙ্গোয় আমরা কিভাবে ফর্ম ডাটা হ্যান্ডল করতে পারি সেটা দেখবো । আসুন poll/detail.html
টেম্প্লেটটিতে নিচের মত করে কোড যোগ করে নেই -{ % if error_message %}<p><strong>{{ error_message }}</strong></p>{ % endif %}
<form action="{ % url 'polls:vote' poll.id %}" method="post">
{ % csrf_token %}
{ % for choice in poll.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{ % endfor %}
<input type="submit" value="Vote" />
</form>
এখানে আসলে কি করলাম আমরা?
- প্রতে্যকটা
choice
এর জন্য আমরা একটি করে রেডিও বাটন বসালাম । যখন ব্যবহারকারী যে কোন অপশন নির্বাচন করে ফর্মটি সাবমিট করবে তখন আমরাPOST
ডাটা হিসেবে পাবো এমন কিছু একটা -choice=3
। (বিষয়টি আরো বিশদভাবো বোঝার জন্য HTML এবং<form>
সম্পর্কে ভালো করে জানা প্রয়োজন) - ফর্ম এর
action
হিসেবে আমরা ব্যবহার করেছি{ % url 'polls:vote' poll.id %}
এবংmethod
হিসেবেpost
।url
একটি টেম্প্লেট ট্যাগ যেটিpolls:vote
এবংpoll.id
এর মান ব ্যবহার করে সঠিক url টি আউটপুট দিবে । forloop.counter
দিয়ে আমরা বুঝতে পারিfor
লুপ এ ঠিক কতোবার লুপ ঘটেছে- জ্যাঙ্গো স্বাভাবিকভাবে Cross Site Request Forgery ঠেকানোর চেষ্টা করে । এজন্য প্রতিটি ফর্মে
{ % csrf_token %}
থাকা অত্যাবশ্যক । এটি না থাকলে জ্যাঙ্গো ধরে নেয় রিকুয়েস্টটিতে কোন ঘাপলা আছে এব ং সে আর এটা প্রসেস করে না । যদিও এটা ডিজএ্যাবল করা যায় কিন্তু এটা ব্যবহার করা উচিৎ ।
আমরা আগের অধ্যায়ে নিচের URLconf টি তৈরি করেছিলাম -
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
সাথে সাথে আমরা একটি ডামি ভিউও তৈরি করেছিলাম যেটা আসলে তেমন কোন কাজই করতো না । এবার আমরা এই ভিউটিকে পরিবর্ত ন করে নিবো নিচের মত করে -
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from polls.models import Choice, Poll
# ...
def vote(request, poll_id):
p = get_object_or_404(Poll, pk=poll_id)
try:
selected_choice = p.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# Redisplay the poll voting form.
return render(request, 'polls/detail.html', {
'poll': p,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))
এখানে কি করছি আমরা?
request.POST
হচ্ছে পাইথন ডিকশনারী । এখানে সব ডাটা কি-ভ্যালু জোড় হিসেবে থাকে । যেমন:request.POST['choice']
থেকে আমরাchoice
এর মান পেতে পারি । যদি POST ডাটায়choice
না থাকে তবে জ্যাঙ্গোKeyError
রেইজ করবে । একারণেই আমরা try…except ব্লক ব্যবহার করেছি ।- এখানে আমরা
HttpResponse
না পাঠিয়েHttpResponseRedirect
রিটার্ন করছি । এটার মাধ্যমে কোন আউটপুট না দেখিয়ে আমরা ব্যবহারকারীকে অন্য ঠিকানায় পাঠিয়ে দিতে পারি । reverse()
ফাংশনটি{ % url %}
টেম্প্লেট ট্যাগের মত করেই ভিউ এর নাম থেকে পূর্ণ URL রিটার্ন করে ।
এখন এ্যাপ্লিকেশনে কেউ ভোট দিলে আমরা
results()
ভিউতে রিডিরেক্ট করে দিবে । আসুন সেই ভিউটি তৈরি করে নেই এবার -def results(request, poll_id):
poll = get_object_or_404(Poll, pk=poll_id)
return render(request, 'polls/results.html', {'poll': poll})
এবার ভিউটির জন্য টেম্প্লেট তৈরি করে নেই -
- { % for choice in poll.choice_set.all %}
- {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
- { % endfor %}
<a href="{ % url 'polls:detail' poll.id %}">Vote again?</a>
এবার এ্যাপ্লিকেশনটি রান করুন এবং ভোট দিয়ে দেখুন কেমন কাজ করে ।
এই ৪টি অধ্যায় ভালো করে রপ্ত করতে পারলে জ্যাঙ্গো ব্যবহার করে সাধারণ ওয়েবসাইট খুব সহজেই তৈরি করতে পারবেন । তবে এখানেই থেমে থাকলে চলবে না । এই টিউটোরিয়ালটি নবীনদের কথা চিন্তা করে অফিশিয়াল টিউটোরিয়াল থেকে বেশ পরিবর্তন পরিবর্ধন করে লেখা হয়েছে । তাই অধিকাংশ সময়েই বেস্ট প্র্যাক্টিসের চাইতে সহজবোধ্যতার উপরে জোর দেওয়া হয়েছে । জ্যাঙ্গোর এ্যাডভান্সড কনসেপ্টগুলো আয়ত্ব করতে পারলে এই কাজগুলো করা যায় আরো সহজে, আরো সুন্দর করে ।
জ্যাঙ্গোর নানা ফিচার, বেস্ট প্র্যাকটিস কিংবা এ্যাডভান্সড অনেক কনসেপ্ট নিয়ে আলাদা আলাদা ভাবে আলোচনা করা হবে এই বইয়ের অন্য অংশে ।
এই টিউটোরিয়াল ফলো করে তৈরি করা একটি স্যাম্পল এ্যাপ্লিকেশন পাওয়া যাবে শিবলি ভাইয়ের গিট রেপোতে - https://github.com/Shibly/Poll :)
Last modified 5yr ago