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

Uncategorized

ফর্ম এডিট ও ডিলিট করা

by , on
June 21, 2017

 

বাংলায় জ্যাঙ্গো টিউটোরিয়াল সিরিজের আজকের পর্বে আমরা যে কোন পোষ্ট বা অবজেক্ট এডিট করা শিখব। প্রথমে আমাদের এপ এর url এর মধ্যে এডিট এর url যুক্ত করি।

# cost_management/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('list/', views.my_expense, name='cost-list'),
    path('add/', views.add_expense, name='add-expense'),
    path('edit/<int:expense_id>/', views.edit_expense, name='edit-expense'),
]

localhost:800

{% extends 'base.html' %}

{% block content %}
<table class="table  table-striped">
<thead>
<tr>
    <th>Purpose</th>
    <th>Amount</th>
    <th>Date</th>
    <th>Action</th>
</tr>
</thead>
<tbody>
{% for expense in expenses %}
<tr>
    <td>{{ expense.purpose }}</td>
    <td>{{ expense.amount }}</td>
    <td>{{ expense.date }}</td>
    <td><a class="btn btn-primary" href="#">Edit</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<a class="btn btn-primary" href=" {% url 'add-expense' %}">Add New Expense</a>
{% endblock %}

 

# cost_management/views.py

def edit_expense(request, expense_id):
    expense = Expense.objects.get(id=expense_id)
    if request.method == 'POST':
        print("post request")
    else:
        form = ExpenseForm(instance=expense)
    context = {'form':form}
    return render(request, 'cost/edit_expense.html', context)

 

<td>
    <a class="btn btn-primary" href="{% url 'edit-expense' expense.id %}">Edit</a>
</td>

 

# templates/cost/edit_expense.html

{% extends 'base.html' %}

{% block content %}
    <form method="POST" class="form-horizontal"> {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-default">Save</button>
    </form>

{% endblock %}

 

 

# cost_management/views.py

def edit_expense(request, expense_id):
    expense = Expense.objects.get(id=expense_id)
    if request.method == 'POST':
        form  = ExpenseForm(request.POST, instance=expense)
        form.save()
        return redirect('cost-list')
    else:
        form = ExpenseForm(instance=expense)
    context = {'form':form}
    return render(request, 'cost/edit_expense.html', context)

Delete: 

# templates/cost/expense.html

<td>
        <a class="btn btn-primary" href="{% url 'edit-expense' expense.id %}">Edit</a>
        <a class="btn btn-danger" href="{% url 'delete-expense' expense.id %}">Delete</a>
    </td>

 

# cost_management/urls.py

path('edit/<int:expense_id>/', views.edit_expense, name='edit-expense'),
path('delete/<int:expense_id>/', views.delete_expense, name='delete-expense'),

 

# cost_management/views.py

def delete_expense(request, expense_id):
    expense = Expense.objects.get(id=expense_id)
    expense.delete()
    return redirect('cost-list')

 

 

Uncategorized

জ্যাঙ্গো এডমিনে কাস্টম ভিউ যোগ করা

by , on
June 11, 2017

custom_admin নামে একটি নতুন এপ তৈরী করি

python manage.py startapp custom_admin

settings.py এর installed apps এ এপটি যুক্ত করি।

মূল urls.py এ একটি urlযুক্ত করি । অবশ্যই url টি এডমিন url এর আগে থাকতে হবে

bangladj/urls.py

from custom_admin import views as custom_admin_views

path('admin/myview', custom_admin_views.myview, name='custom-view'),
path('admin/', admin.site.urls),

custom_admin.views এ নতুন ভিউ তৈরী করি।

from django.shortcuts import render, render_to_response
from django.template import RequestContext

def myview(request):
    return render_to_response('custom_admin/c_index.html',
                                context=RequestContext(request))

templates custom_admin ডিরেক্টরী তৈরী করে c_index.html ফাইলটি তৈরী করে যা ইচ্ছা যুক্ত করি।

অবশ্যই staff_member_required ডেকরেটরটি ব্যাবহার করি

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def myview(request):

আপনার পেজকে জ্যাঙ্গো এডমিনের মত চেহারা দিতে চাইলে c_index.html এ যুক্ত করুন

{% extends “admin/base_site.html” %}

নতুন স্টাইল যুক্ত করতে {% block extrastyle %} javascript যুক্ত করতে {% block extrahead %} ব্যাবহার করি।

এখন http://localhost:8000/admin/myview এ আপনার ভিউটি দেখতে পারবেন ।

পেজের উপরের দিকে Home > My View এরকম লিঙ্ক তৈরী করতে

{% block breadcrumbs %}
<div class="breadcrumbs">
    <a href="/admin/"> {% trans "Home" %} </a> > My View 
</div>

{% endblock %}

 

এখন আমি চাচ্ছি , এডমিন পেজের উপরের ডান কর্নারে welcome admin My View/View site এভাবে লিঙ্ক যুক্ত করতে। templates এর মধ্যে admin নামে ডিরেক্টরী তৈরী করি। জ্যাঙ্গো গিটহাব থেকে django/contrib/admin/templates/admin ( https://github.com/django/django/tree/master/django/contrib/admin/templates/admin )

base.html কে admin ডিরেক্টরীতে কপি করি। {% block userlinks %} এর মধ্যে যুক্ত করি

<a href="{% url 'custom-view'%}">Custom view</a> /

এখন আমরা এই লিঙ্ক থেকে আমাদের কাষ্টম ভিউ দেখতে পারব।

Uncategorized

একই পেজে Redirect করা

by , on
June 10, 2017

এটা get_absolute_url() ম্যাথড কে কল করবে

from django.shortcuts import redirect
from simple_blog.models import Post

def post_view(request, post_id):
    post = Post.objects.get(pk=post_id)
    return redirect(post)
    # equivalent to: return HttpResponseRedirect(post.get_absolute_url())

 

Uncategorized

ইউজার লগিন, লগআউট – ১ম পর্ব

by , on
June 5, 2017

আজকের পর্বে আমরা ব্যাবহারকারীর লগিন করা, লগ আউট করা এবং রেজিষ্টেশন করা দেখব। এই কাজটিই করার জন্য আমরা ইতপূর্বে এডমিন পাতা ব্যাবহার করেছিলাম ( localhost:8000/admin)। কিন্তু সকল ব্যাবহারকারীর জন্য এই পাতা ব্যাবহার করতে দেয়া উচিত নয়। আমরা একটি লগিন পেজ তৈরী করব এবং ব্যাবহারকারী এই পেজের মাধ্যমে লগিন করতে পারবে এবং আমার আমাদের কোন একটি ভিউকে বলে দিতে পারি যে ইউজার লগিন করা ছাড়া আমাদের এই পেজটি দেখা যাবে না।

লগিন

প্রথমে আমাদেকে একটি লগিন ভিউ তৈরী করতে হবে । কাজটি আমরা একটি এপ তৈরী করে তার views.py এর মধ্যে করতে পারি। আবার প্রজেক্ট ডিরেক্টরী (যেখানে settings.py রয়েছে ) তে views.py তৈরী করেও করতে পারি।

banglaidj/banglaidj/views.py

def user_login(request):
    return render(request, 'login.html')

**উল্লেখ্য, ভিউ এর নাম শুধু login দেয়া যাবে না , কারন জ্যাঙ্গোর এই নামে লগিন ফাংশন রয়েছে।

templates/login.html

{% extends "base.html" %}

{% block content %}
  <h1>লগিন</h1>


  <form class='form' id="login_form" method="post" action="/login/">
            {% csrf_token %}
            Username: <input type="text" name="username" value="" size="50" />
            <br />
            Password: <input type="password" name="password" value="" size="50" />
            <br />

            <input type="submit" value="submit" />
  </form>
{% endblock content %}

 

method=’post’ অর্থ হল , আমরা ফর্মের মাধ্যমে কিছু ডাটা পোষ্ট করতে চাচ্ছি। action=”/login/” অর্থ আমাদের ফর্মটি পোষ্ট হবে /login/ ইউআরএল এ অর্থাৎ user_login ভিউ এ। name=”username”, name=”password” আমাদের ফর্ম ফিল্ডের নাম। আমরা এই ফিল্ডে পূরনকৃত তথ্য username password এর মধ্যমে পাব।

এই কাজটি পাওয়ার জন্য url তৈরী করি।

banglaidj/banglaidj/urls.py

from django.urls import path, include
from django.contrib import admin
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.user_login, name='login'),
    path('blog/', include('blog_post.urls'), name='home'),
    path('cost/', include('cost_management.urls'), name='cost'),
    path('information/', include('information.urls'), name='information'),

]

localhost:8000/login এ প্রবেশ করলে আমাদের লগিন পেজ দেখতে পাবো

username, password পূরন করে সাবমিট করলে প্রদত্ত তথ্য user_login এর মধ্যে গ্রহন করতে পারব।

ফর্ম আমাদের ভিউকে কি পাঠাচ্ছে ? দেখতে হলে user_login ভিউ এর মধ্য নিচের লাইনগুলো লিখি

if request.method == 'POST':
    print("we got post request")
    print(request.POST)

elif request.method == 'GET':
    print("It's a GET request")

আমরা যখন প্রথমবার লগিন পেজ লোড করি তখন রিকুয়েষ্ট এর ধরন হয় GET এবং যখন ফর্ম সাবমিট করি তখন POSTrequest.POST এর মাধ্যমে ফর্ম পোষ্ট করা ডাটা দেখতে পাব। ফর্ম পুরন করে সাবমিট করে টারমিনালে লক্ষ করুন

<QueryDict: {u'username': [u'harun'], u'csrfmiddlewaretoken': [u'ioTNGpgqnsnCSANRqsbVMSp4ktomYryFOYLG4Tab3xtmePEMQlsnvcVcWej6PU5l'], u'password': [u'password']}

আমরা একটি ডিক্সনারী পেয়েছি যাতে username, password, এবং csrfmiddlewaretoken ও পেয়েছি যেটা {{ csrf_token }} তৈরী হয়। এখান থেকে username, password সংগ্রহ করব।

if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')

এখন আমাদের দেখা দরকার যে এই ইউজারনেম ও পাসওয়ার্ড এ কোন ইউজার আছে কি না। জ্যাঙ্গো ইউজার ম্যানেজ করার জন্য User নামে ক্লাস ব্যাবহার করে। authenticate ম্যাথডেটি ইউজারের username, password চেক করে । যদি কোন ইউজার পাই তাহলে একটি User অবজেক্ট রিটার্ন করে। login ম্যাথড ইউজারকে লগিন করে । সে জ্যাঙ্গো সেশনকে বলে দেয় যে এই ইউজার এখন লগিন অবস্থায় আছে ।

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login, logout

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user:
            login(request, user)
            return render(request, 'thankyou.html')
        else:
            return HttpResponse("Username or password incorrect")
    return render(request, 'login.html')

যদি ইউজার , পাসওয়ার্ড ঠিক থাকে তাহলে hankyou.html পেজ দেখাবে, ভুল হলে ইরর বার্তা দেখাবে। (** টেমপ্লেট এ hankyou.html ফাইলটি তৈরী করি)

createsuperuser দিয়ে তৈরী করা ইউজার দিয়ে লগিন করি। অথবা জ্যাঙ্গো এডমিন পেজ (localhost:8000/admin) এর user সেকশন থেকে নতুন ইউজার তৈরী করে /login পেজ টেষ্ট করি।

লগ আউট:

প্রথমে লগআউট view তৈরী করি।

# banglaidj/views.py
.......
......

def user_logout(request):
    logout(request)
    return HttpResponseRedirect('/login')

url :

banglaidj/banglaidj/urls.py

…..

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

লগআউট বাটন:

templates/thankyou.html

{% extends "base.html" %}

{% block content %}
<h1>স্বাগতম </h1>
<p>লগিন সম্পন্য হয়েছে</p>
<a class="btn btn-primary" href="{% url 'logout' %}">Log Out</a>
{% endblock content %}

এই পর্বে লগিন ও লগআউটের মূল ব্যাবহার গুল দেখলাম, আগামী পর্বে এই কোডকেই সুন্দর করে সাজাবো এবং লগিন লগআউটের আরো কিছু ব্যাবহার দেখব।