Как установить значения для выпадающих опций и сделать некоторые вычисления в Django? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь создать форму заказа для клиентов, клиент должен выбрать количество и номер карты, исходя из этого, должны быть некоторые расчеты для получения общей цены (цена за карту * количество). Как я могу установить значения (цены) для каждого номера_карты, а затем выполнить расчет и сохранить общую стоимость в базе данных? Я использую Django ПРИМЕЧАНИЕ: каждый номер_карты имеет свою цену.

forms.py

from django import forms
from .models import cardDatabase

card_number_choice = {
    (7239, 7239),
    (7227, 7227),
    (7230, 7230),
    (7217, 7217),
    (2167, 2167),
    (7214, 7214),
    (7233, 7233),
    (7237, 7237),
    (7230, 7230),
    (7229, 7229),
    (7228, 7228),
    (3730, 3730),
    (5660, 5660),
    (7224, 7224),
    (7221, 7221),
    (7241, 7241),
    (7252, 7252),
    (5642, 5642),
    (2680, 2680),
    (5659, 5659),
    (2767, 2767),
    (3718, 3718),
    (5644, 5644),
    (5645, 5645),
    (5646, 5646),
    (5665, 5665),
    (5580, 5580),
}
quantity_choices = {
    (50, 50),
    (100, 100),
    (150, 150),
    (200, 200),
    (250, 250),
}
class cardForm(forms.ModelForm):
    card_number = forms.IntegerField(help_text="ex: 7643", widget= forms.Select(choices=card_number_choice))
    content = forms.CharField(widget=forms.Textarea(attrs={'rows': 5, 'placeholder': 'What do you want to write on the card!'}), max_length=3000)
    quantity = forms.IntegerField(help_text="Multiple of 50", widget=forms.Select(choices=quantity_choices))
    phone_number = forms.IntegerField(help_text="ex: +966000000000")

 class Meta:
        model = cardDatabase
        fields = ['card_number', 'quantity', 'phone_number', 'content']

views.py

from django.shortcuts import render_to_response, redirect, render
from .models import cardDatabase
from .forms import cardForm
from django.template.context_processors import csrf

def g (request):
    all_cards = cardDatabase.objects.order_by('-id')[:1]
    return render(request,'g.html',{'cards': all_cards})

def card(request):
    if request.method == "POST":
        form = cardForm(request.POST)
        if form.is_valid():
            form.save()
            try:
                return redirect('g')
            except:

                pass
    else:
        form = cardForm()
    return render(request, 'cardDa.html', {'form':form})

models.py

from django.db import models


class cardDatabase(models.Model):
        card_number= models.IntegerField(max_length=4)
        content = models.TextField(max_length=3000)
        quantity = models.IntegerField(max_length=5)
        phone_number = models.IntegerField()

1 Ответ

0 голосов
/ 01 мая 2020

Вы сказали в комментарии, что вам также нужно хранить цены. Поэтому я бы порекомендовал модель CardOrder, которая представляет отдельные экземпляры заказов на карты, а также отдельную модель CardType с ценами.

class CardType(models.Model):
    number = models.IntegerField()
    price = models.IntegerField()

class CardOrder(models.Model):
    type = models.ForeignKeyField(
        to=CardType,
        on_delete=models.PROTECT)
    content = models.TextField(
        max_length=3000)
    quantity = models.IntegerField()

    @property
    def total_price(self):
        return self.quantity * self.type.price

Конечно, если вам нужны цены с десятичными знаками, используйте DecimalField вместо целых чисел.

...