5 වන කොටස: Pizza පෙන්වීම සහ Order කිරීම

පරිශීලකයින්ට පීසා ලැයිස්තුව පෙන්වා ඇණවුම් කිරීමට සලස්වන ආකාරය.


පීසා ඇණවුම් කළ හැක්කේ ලියාපදිංචි පරිශීලකයින්ට පමණක් බැවින්, පීසා ලැයිස්තුව පෙන්වන පිටුවට පිවිසීමට login වීම අනිවාර්ය කළ යුතුය. මේ සඳහා Django හි @login_required decorator එක භාවිතා කරමු. මෙමගින්, login නොවූ පරිශීලකයෙක් එම පිටුවට පිවිසීමට උත්සාහ කළහොත්, ඔහුව ස්වයංක්‍රීයව login පිටුවට යොමු කරයි.

Database එකෙන් සියලුම පීසා ගෙන, ඒවා template එකට යවන view එකක් නිර්මාණය කරමු. අපි මෙය අපගේ මුල් පිටුව (Homepage) ලෙස සලකමු.

View orders/views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .models import Pizza # Pizza model එක import කරගන්න

@login_required
def home_view(request):
    pizzas = Pizza.objects.all() # Database එකෙන් සියලුම Pizza objects ලබාගැනීම
    return render(request, 'home.html', {'pizzas': pizzas})
Template templates/home.html
වැඩි දියුණු කළ සැකිල්ල: මෙහිදී පීසා එකක් පෙන්වීමට සරල <div> එකක් වෙනුවට, වඩාත් අලංකාර Bootstrap Card එකක් භාවිතා කර ඇත.
<h1>Our Pizzas</h1>
<div class="row">
    {% for pizza in pizzas %}
    <div class="col-md-6">
        <div class="card mb-3">
            <div class="card-body">
                <h5 class="card-title">{{ pizza.name }}</h5>
                <p class="card-text">Price: Rs. {{ pizza.price }}</p>
                
                <form action="{% url 'add_to_order' %}" method="post">
                    {% csrf_token %}
                    <input type="hidden" name="pizza_id" value="{{ pizza.id }}">
                    <div class="mb-2">
                        <label for="quantity-{{pizza.id}}" class="form-label">Quantity:</label>
                        <input type="number" name="quantity" id="quantity-{{pizza.id}}" class="form-control" value="1" min="1" style="width: 80px;">
                    </div>
                    <button type="submit" class="btn btn-primary">Order Now</button>
                </form>
            </div>
        </div>
    </div>
    {% endfor %}
</div>

action="{% url 'add_to_order' %}": Form එක submit කළ විට, 'add_to_order' නමැති URL එකට දත්ත යැවිය යුතු බව දන්වයි.

URL pizzaproject/urls.py
# pizzaproject/urls.py
from orders import views as orders_views
from django.urls import path

urlpatterns = [
    path('', orders_views.home_view, name='home'), # මුල් පිටුවට අදාළ URL
    # ... අනෙකුත් URLs
]

පරිශීලකයා "Order Now" බොත්තම click කළ විට, එම දත්ත භාරගෙන Order object එකක් නිර්මාණය කරන view එක සකසමු.

View orders/views.py
from .models import Pizza, Order # Order model එකත් import කරගන්න
from django.shortcuts import redirect

@login_required
def add_to_order_view(request):
    if request.method == 'POST':
        # Form එකෙන් එවන දත්ත ලබාගැනීම
        pizza_id = request.POST.get('pizza_id')
        quantity = int(request.POST.get('quantity'))

        # අදාළ Pizza object එක ලබාගැනීම
        try:
            pizza = Pizza.objects.get(id=pizza_id)
        except Pizza.DoesNotExist:
            # Handle error, maybe redirect back with a message
            return redirect('home')

        # මුළු මුදල ගණනය කිරීම
        total_price = pizza.price * quantity

        # නව Order object එකක් නිර්මාණය කිරීම
        Order.objects.create(
            pizza=pizza,
            user=request.user, # Login වී සිටින user
            quantity=quantity,
            total_price=total_price
            # Status එක default 'Pending' ලෙස Model එකේ ඇති නිසා මෙහිදී දීමට අවශ්‍ය නැත
        )
        
        # සාර්ථකව ඇණවුම සෑදූ පසු, වෙනත් පිටුවකට යොමු කිරීම
        # 'my_orders' යනු ඊළඟ කොටසේදී සාදන පිටුවයි
        return redirect('my_orders') 
        
    # POST request එකක් නොවේ නම්, home එකටම යොමු කරන්න
    return redirect('home')
URL pizzaproject/urls.py
urlpatterns = [
    # ...
    path('add_to_order/', orders_views.add_to_order_view, name='add_to_order'),
    # ...
]