বাংলায় জ্যাঙ্গো

reverse() এবং redirect() এর মধ্যে পার্থক্য

by , on
December 27, 2018

ধরি আমাদের দুইটি url আছে এরকম

path('student/login', views.user_login, name='login'),
path('student/logout', views.user_logout, name='logout'),

এখন আমরা চাই, কোন ইউজার লগআউট করলে তাকে আবার লগিন পেজে নিয়ে যাবে । তাহলে আমরা  লগআউট ভিউ এ redirect() ফাংশনটিকে  কয়েকভাবে লিখতে পারি

১। url এর নাম লিখে ( name=’login’)

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect('login')

২। সরাসরি url লিখে

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect('/student/login')

৩। reverse() ফাংশন ব্যাবহার করে

from django.shortcuts import redirect
from django.urls import reverse

def user_logout(request):
    logout(request)
    return redirect(reverse('login'))

reverse() ফাংশন URL এর নামকে সরাসরি URL স্টাইলে রূপান্তর করে

python manage.py shell

>>> from django.urls import reverse
>>> reverse('login')
'/student/login'

৪। redirect() ফাংশন মডেল অবজেক্টকেও গ্রহন করে। অবজক্টটি  get_absolute_url() ফাংশনকে কল করে। 

from django.shortcuts import redirect

def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj)

বিস্তারিত দেখুন redirect(), reverse()

১-৬ঃ Template কে Dynamic করা

by , on
January 7, 2017

index.html ফাইলে কিছু কোড লিখে ফেলি

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am Harun Ur Rashid </h2> 
    </body> 
</html>

আমাদের পেজে Hello, I am Harun Ur Rashid । কিন্তু এটা তো আমরা টেমপ্লেটের মাঝে নিজের হাতে তৈরি করেছি। আমরা এখন চাচ্ছি views.py ফাইলে আমাদের নাম পরিবর্তন করব, স্বয়ংক্রিয় ভাবে টেমপ্লেটেও নাম পরিবর্তন হয়ে যাবে।

পুর্বেই বলেছিলাম যে render()  ফাংশন তিনটি প্যারামিটার গ্রহণ করে, এই তৃতীয় প্যারামিটারটিকে context variable বলে। context variable  হিসেবে Dictionary ব্যাবহার করা হয়। এটা অনেকটা পাইপ লাইনের মত কাজ করে । এই পাইপ লাইনের মাধ্যমে view থেকে template এ ডাটা পাঠানো যায়।

তাহলে আমাদের render() এর রূপ হবে

render(request, ‘index.html’, {} )

এখানে Dictionary টি কে আমরা নিজের মনের মত সাজাতে পারি

{

'name': “Harun Ur Rashid”

'district':”kushtia”

}

এখন view দেখতে হবে,

def home(request):
 	return render(request, 'index.html',{'name':”harun Ur Rashid”,'district':”kushtia”})

আবারও index.html ফাইলকে পরিবর্তন করি,

<html> 
    <head></head> 
    <body> 
      <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>
      <h2>Hello, I am {{ name }}</h2>
      <h2>My District is: {{ district }}</h2>
    </body>
</html>

আমরা টেমপ্লেট এর মধ্যে {{ }} চিহ্ন ব্যাবহার করেছি। একে জ্যাঙ্গো টেমপ্লেট ইঞ্জিন এর ভাষায় template variable বলা হয় । Variable এর ভ্যালু দেখার জন্য  {{ variable_name }} ব্যাবহার করা হয়।  অর্থাৎ,  Dictionary এর key এর ভ্যালু যদি সাধারন string, number হয় তাহলে {{ key_name }} ব্যাবহার করে লিখতে পারি। কিন্তু Dictionary এর key এর ভ্যালু যদি কন্ডিশন, লুপ ইত্যাদি হয় তাহলে {%  %} চিহ্ন ব্যাবহার করা হয়। একে Template Tag বলা হয়।    এভাবে আমরা ইচ্ছামত Dictionary এর key পরিবর্তন করে টেমপ্লেট এর Value পরিবর্তন করতে পারি ।

Template এ সকল পোষ্ট দেখানোঃ

এখন আমরা দেখব কিভাবে আমাদের এডমিন প্যানেল থেকে তৈরি করা সকল পোষ্ট আমাদের Template দেখানো যায় ।

প্রথমে views.py এর home() ভিউ দেখি। এই ভিউ এর মধ্যে ডাটাবেজে জমা হওয়া সকল পোষ্ট নিয়ে আসব। এরপর ভিউ থেকে টেমপ্লেটে এ পাঠিয়ে দেব।

from django.shortcuts import render
from .models import Post

def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html')

from .models import Post  দ্বারা আমরা models.py ফাইলের Post  ক্লাসটি views.py ফাইলে import করলাম। আমরা যখন এডমিন প্যানেল থেকে নতুন নতুন Post তৈরি করছিলাম তখন আসলে Post ক্লাসে object তৈরি করছিল। এক একটি পোষ্ট আসলে এক একটি object. তাহলে সকল পোষ্ট আনতে হলে পাইথনের ভাষায় সকল objects নিয়ে আসতে হবে। Post.objects.all() দিলে সকল পোষ্ট লিস্ট আকারে চলে আসবে। এখানে Post হচ্ছে  models.py এর  Post ক্লাস । এখন এই পোষ্ট এর লিস্ট কে একটি variable এর মধ্যে জমা করলাম। আমরা প্রিন্ট করে দেখতে পারি  all_post  এর মধ্যে কি জমা হয়েছে । নিচের লাইনে লিখুন print(all_post)। পেজটি রিলোড দিয়ে টার্মিনালে লক্ষ করি

<QuerySet [<Post: my first post>, <Post: My 2nd post>]>

অর্থাৎ, all_post  একটি QuerySet ( Post.objects.all() কে Query বলে) যার মধ্যে লিস্ট আছে । লিস্টের মধ্যে লক্ষ করি , প্রতিটি পোষ্টের টাইটেল দেখাচ্ছে। model.py এর def __str__() ম্যাথড দ্বারা আমরা এই টাইটেল কে রিটার্ন করতে বলেছিলাম।

আমরা ফর লুপের মাধ্যমে প্রতিটা পোষ্ট আলাদা করে ফেলতে পারি ।

def home(request):
    all_post = Post.objects.all()
    for post in all_post:
        print(post)

    return render(request, 'index.html')

আমাদের Post ক্লাসের মধ্যে title ও description  ফিল্ড আছে। print(post.title), print(post.description) দিয়ে মজা দেখুন। প্রিতিবার কোড পরিবর্তন করার পর পেজ রিলোড দিতে ভোলা চলবে না।

from .models import Post


def home(request):
    all_post = Post.objects.all()
    return render(request, 'index.html', {'all_post_list': all_post})
# index.html

<html>
<head></head>
<body>
    <h1>স্বাগতম বাংলায় জ্যাঙ্গো টিউটোরিয়াল এর প্রথম টেমপ্লেট এ </h1>

    {% for post in all_post_list %}
       {{ post }}
    {% endfor %}
</body>
</html>

পরবর্তী পোষ্ট >>