Передача данных из отправки формы в зависимости от значения

#django #django-forms

#django #django-forms

Вопрос:

Я пытаюсь передать данные из формы в зависимости от различных вычислений из формы отправки

Полная модель

     from django.db import models
from datetime import datetime, date

# Create your models here.

year_choice = [
    ('year1','1-Year'),
    ('year3','3-Year')
]
weeksinyear = 52
hours = 6.5

class AdminData(models.Model):
    year1 = models.IntegerField()
    year3 = models.IntegerField()

    @property
    def day_rate_year1(self):
        return self.year1 / weeksinyear / hours

    @property
    def day_rate_year3(self):
        return self.year3 / weeksinyear / hours


class Price(models.Model):
        name = models.CharField(max_length=100)
        contract = models.CharField(max_length=5, choices=year_choice)
        start_date = models.DateField(default=datetime.now)
        end_date = models.DateField(default=datetime(2021,3,31))
        epoch_year = date.today().year
        year_start = date(epoch_year, 1, 4)
        year_end = date(epoch_year, 3 , 31)


        def __str__(self):
            return self.name

        @property
        def pricing(self):
            price_days = self.start_date - self.year_end
            return price_days
 

Число просмотров

 def price_detail(request):

    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = PriceForm(request.POST)

        # check whether it's valid:
        if form.is_valid():
            form.save()

            return render(request,'confirmation.html',{'form_data': form.cleaned_data})
    else:
        form = PriceForm()


    return render(request, 'main.html', {'form': form})
 

Итак, идея состоит в том, чтобы изменить отображение деталей на confirmation.html страница в зависимости от типа контракта и даты начала, ниже приведен простой, но наиболее похожий на неправильный пример:

 def pricingcalc(request):
    if PriceForm.contract == 'year1'
        return Price.pricing * AdminData.day_rate_year1
    else
        return Price.pricing * AdminData.day_rate_year3
 

Подводя итог:

  • Вывод списка значений на странице подтверждения
  • Вывод на основе количества дней x цены в зависимости от годового контракта или трехлетнего контракта.

Надеюсь, это имеет смысл.

Спасибо за помощь.

Комментарии:

1. Также опубликуйте свое PriceForm определение. Это поможет. Это a ModelForm ? Затем вы можете работать с созданным экземпляром. Но это все предположения, пока мы не увидим форму.

2. Modelform, добавил его.

Ответ №1:

Если мы посмотрим в документации на то, как работают формы модели (точнее здесь ), мы увидим, что как только мы вызовем .save() a ModelForm , мы вернем экземпляр этой модели.

В вашем случае мы можем предположить следующее:

 if form.is_valid():
    price_instance = form.save()
 

Теперь, если вы хотите отобразить некоторые динамические вычисляемые значения для вашей модели ценообразования, вы можете добавить в свою Price модель метод, который вычисляет их на основе Price.contract .

Важная идея здесь заключается в том, что как только a ModelForm считается valid , и вы вызываете .save() его, это зафиксирует данные по умолчанию в вашей базе данных и вернет экземпляр этой модели, который вы можете использовать впоследствии.

Комментарии:

1. Спасибо, это имеет смысл, и я еще немного изучу это.

2. Я не понимаю, как настроить метод в модели для расчета цены, я не могу найти правильный способ сделать это: if self.contract == year_choice('year1')

3. if self.contract == year_choice[0][0] . Я бы рекомендовал заглянуть в пакет model_utils и класс Choices 🙂

4. Алекс, я все еще не могу понять, как передать значения на страницу подтверждения, и не могу понять, как выполнять вычисления в модели. Я потратил последние 6 часов на поиски, и у меня болит голова: P