Django - Python: Пакет покупок для театральных билетов. Модели билетов для двух отдельных цен (взрослая_цена/детская_цена)

Я создаю Django-проект, позволяющий продавать билеты на различные даты в театр с указанием цены для взрослых и цены для детей. Я создал models.py и ticket_details.html.

К сожалению, я получаю ошибку: у объекта 'int' нет атрибута 'get' и я в растерянности, как мне получить цену взрослого и ребенка для общего подсчета, чтобы отобразить в моем bag.html.

Проблема заключается в моих файлах contexts.py и views.py. Я пробовал использовать опцию 'get', но она не работает. Может кто-нибудь подсказать?

введите описание изображения здесь

models.py:

class Show(models.Model):

    '''Programmatic Name'''
    name = models.CharField(max_length=254)
    friendly_name = models.CharField(max_length=254, null=True, blank=True)
    poster = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.name

    def get_friendly_name(self):
        return self.friendly_name


class Ticket(models.Model):

    show = models.ForeignKey('show', null=True, blank=True, on_delete=models.SET_NULL)
    name = models.CharField(max_length=254)
    event_date = models.CharField(max_length=254)
    description = models.TextField(null=True, blank=True)
    event_details = models.TextField(null=True, blank=True)
    place = models.CharField(max_length=254)
    location = models.CharField(max_length=254)
    position = models.CharField(max_length=254)
    image = models.ImageField(null=True, blank=True)
    price_details = models.TextField(null=True, blank=True)
    date = models.DateTimeField(null=True, blank=True)
    adult_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    child_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)

    def __str__(self):
        return self.name

ticket_detail.html:

Я создал приложение для 'bag', а также views.py и contexts.py соответственно.

bag.html

views.py

def add_to_bag(request, item_id):
    '''Submit form to this view including ticket id and quanity'''
    ''' Add a quantity of the specified tickets to the shopping bag'''

    child_quantity = int(request.POST.get('adult_quantity'))
    adult_quantity = int(request.POST.get('adult_quantity'))
    redirect_url = request.POST.get('redirect_url')
    bag = request.session.get('bag', {})
    '''Once in view get bag variable if exisits in session or create if doesnt'''

    '''Add to bag'''

    def add_quantity(quantity, item_id, bag):
        if quantity:
            if item_id in list(bag.keys()):
                bag[item_id] += quantity
            else:
                bag[item_id] = quantity

    if adult_quantity or child_quantity:

        if adult_quantity:
            add_quantity(
                adult_quantity,
                'adult_quantity',
                item_id,
                bag,)

        if child_quantity:
            add_quantity(
                child_quantity,
                'child_quantity',
                item_id,
                bag,)

    request.session['bag'] = bag
    return redirect(redirect_url)

contexts.py

from django.conf import settings
from django.shortcuts import get_object_or_404
from tickets.models import Ticket


def bag_contents(request):

    bag_items = []
    '''Empty list for bag items to live in'''
    total = 0
    ticket_count = 0
    bag = request.session.get('bag', {})

    for item_id, adult_quantity in bag.items():
        if adult_quantity.get('adult_quantity'):
            ticket = get_object_or_404(Ticket, pk=item_id)
            total += adult_quantity.get('adult_quantity') * ticket.adult_price
            ticket_count += adult_quantity.get('adult_quantity')
            bag_items.append({
                'item_id': item_id,
                'quantity': adult_quantity.get('adult_quantity'),
                'ticket': ticket,
                'adult_ticket': True,
            })

    for item_id, child_quantity in bag.items():
        if child_quantity.get('child_quantity'):
            ticket = get_object_or_404(Ticket, pk=item_id)
            total += child_quantity.get('child_quantity') * ticket.child_price
            ticket_count += child_quantity.get('child_quantity')
            bag_items.append({
                'item_id': item_id,
                'quantity': child_quantity.get('child_quantity'),
                'ticket': ticket,
                'child_ticket': True,
            })

    grand_total = total

    context = {
        'bag_items': bag_items,
        'total': total,
        'ticket_count': ticket_count,
        'grand_total': grand_total,
    }

    '''Make dictionary available to all templates across the enitire application'''
    return context

Проблема в том, как вы выполняете итерацию в for item_id, adult_quantity in bag.items():. Я вижу, что bag - это словарь, и я думаю, что это словарь типа:

{
    'item_id': 1,
    'quantity': 10,
    'ticket': ticket,
    'adult_ticket': True,
}

Если это верно, тогда зачем вам нужно выполнять итерацию через bag в contexts.py? Разве это не работает:

def bag_contents(request):

    bag_items = []
    '''Empty list for bag items to live in'''
    total = 0
    ticket_count = 0
    bag = request.session.get('bag', {})

    ticket = get_object_or_404(Ticket, pk=item_id)

    if bag.adult_ticket:
        total += bag.quantity * ticket.adult_price
        bag_items.append({
            'item_id': item_id,
            'quantity': bag.quantity,
            'ticket': ticket,
            'adult_ticket': True,
        })
    else:
        total += bag.quantity * ticket.child_price
        bag_items.append({
            'item_id': item_id,
            'quantity': bag.quantity,
            'ticket': ticket,
            'child_ticket': True,
        })
        
    ticket_count += bag.quantity


    grand_total = total

    context = {
        'bag_items': bag_items,
        'total': total,
        'ticket_count': ticket_count,
        'grand_total': grand_total,
    }

    '''Make dictionary available to all templates across the enitire application'''
    return context

Опять же, если мое первоначальное предположение верно, то вы, вероятно, могли бы очистить это дальше. Например, вместо того, чтобы иметь словари с разными ключами для взрослых и детей, что если просто иметь тип, например, такой:

{
    'item_id': 1,
    'quantity': 10,
    'ticket': ticket,
    'type': 'adult,
}
Вернуться на верх