Django 是否根据表单输入更新已清除的数据?

Django 是否根据表单输入更新已清除的数据?,django,validation,django-forms,Django,Validation,Django Forms,我试图调整从modelform获得的数据,以便根据用户输入将某些值保存到模型中。这些输入可能差异很大,请参见下面的模型以及表单和视图 我应该在模型表单中调用模型方法,还是应该在模型表单本身中进行所有计算。数字可能会根据所选合同和所选开始日期而变化,因为它将计算天数并基于合同的此价格,但是如果是半天,则只需将数字除以2即可 我还是Django的新手,但我试图找出所有这些信息应该放在哪里,对此我毫无头绪,而是试图通过真实逼真的应用程序来学习Django,所以感谢您的帮助 型号 class Admin

我试图调整从modelform获得的数据,以便根据用户输入将某些值保存到模型中。这些输入可能差异很大,请参见下面的模型以及表单和视图

我应该在模型表单中调用模型方法,还是应该在模型表单本身中进行所有计算。数字可能会根据所选合同和所选开始日期而变化,因为它将计算天数并基于合同的此价格,但是如果是半天,则只需将数字除以2即可

我还是Django的新手,但我试图找出所有这些信息应该放在哪里,对此我毫无头绪,而是试图通过真实逼真的应用程序来学习Django,所以感谢您的帮助

型号

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

    @property
    def fortnight_dayrate_year1(self):
        return self.year1_fortnight / weeksinyear / 5

    @property
    def fortnight_dayrate_year3(self):
        return self.year3_fortnight / weeksinyear / 5

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

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


class Price(models.Model):
        year_choice = Choices('1-Year Weekly', '3-Year Weekly','1-Year Fortnightly', '3-Year Fortnightly')
        day_choice = Choices('Full Day', 'Half Day')
        name = models.CharField(max_length=100)
        contract = StatusField(choices_name='year_choice')
        time_daily = StatusField(choices_name='day_choice')
        start_date = models.DateField(default=datetime.now)
        end_date = models.DateField(default=datetime(2021,3,31))
        weeksinyear = 52
        hours = 6.5
        epoch_year = date.today().year
        year_start = date(epoch_year, 1, 4)
        year_end = date(epoch_year, 3, 31)

        @property
        def day_count(self):
            return year_end - self.start_date


     #   @property
      #  def price_year1_weekly(self):
      #      if self.contract == self.year_choice[0]
        #        return AdminData.year1 * self.day_count


        def __str__(self):
            return self.name
Forms.py

class PriceForm(forms.ModelForm):
    class Meta:
            model = Price
            fields = ['name', 'contract','time_daily','start_date']
    def price_detail(request):

    if request.method == 'POST':
        form = PriceForm(request.POST)

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


    return render(request, 'main.html', {'form': form})
def price_detail(request):
    form = PriceForm(request.POST or None)

    if form.is_valid():
        price_instance = form.save() // this returns a saved instance
        ... do calculations here ...
        price_instance.calculated_field = 1 + 1 // example calculations
        price_instance.confirmed = False // consider adding a confirmed boolean, to not allow users to alter the data in the next step.
        price_instance.save()

        return render(request, 'confirmation.html', {'price_instance': price_instance})
    else:
        return render(request, 'main.html', {'form': form})
class Price(models.Model):
    year_choice = Choices('1-Year Weekly', '3-Year Weekly','1-Year Fortnightly', '3-Year Fortnightly')
    day_choice = Choices('Full Day', 'Half Day')
    name = models.CharField(max_length=100)
    contract = StatusField(choices_name='year_choice')
    time_daily = StatusField(choices_name='day_choice')
    start_date = models.DateField(default=datetime.now)
    end_date = models.DateField(default=datetime(2021,3,31))
    weeksinyear = 52
    hours = 6.5
    epoch_year = date.today().year
    year_start = date(epoch_year, 1, 4)
    year_end = date(epoch_year, 3, 31)

    @property
    def day_count(self):
        return year_end - self.start_date

    def save(self, *args, **kwargs):
        ... do calculations here ...
        self.calculated_field = 1 + 1 // calculations
        super().save(*args, **kwargs)


    def __str__(self):
        return self.name
视图.py

class PriceForm(forms.ModelForm):
    class Meta:
            model = Price
            fields = ['name', 'contract','time_daily','start_date']
    def price_detail(request):

    if request.method == 'POST':
        form = PriceForm(request.POST)

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


    return render(request, 'main.html', {'form': form})
def price_detail(request):
    form = PriceForm(request.POST or None)

    if form.is_valid():
        price_instance = form.save() // this returns a saved instance
        ... do calculations here ...
        price_instance.calculated_field = 1 + 1 // example calculations
        price_instance.confirmed = False // consider adding a confirmed boolean, to not allow users to alter the data in the next step.
        price_instance.save()

        return render(request, 'confirmation.html', {'price_instance': price_instance})
    else:
        return render(request, 'main.html', {'form': form})
class Price(models.Model):
    year_choice = Choices('1-Year Weekly', '3-Year Weekly','1-Year Fortnightly', '3-Year Fortnightly')
    day_choice = Choices('Full Day', 'Half Day')
    name = models.CharField(max_length=100)
    contract = StatusField(choices_name='year_choice')
    time_daily = StatusField(choices_name='day_choice')
    start_date = models.DateField(default=datetime.now)
    end_date = models.DateField(default=datetime(2021,3,31))
    weeksinyear = 52
    hours = 6.5
    epoch_year = date.today().year
    year_start = date(epoch_year, 1, 4)
    year_end = date(epoch_year, 3, 31)

    @property
    def day_count(self):
        return year_end - self.start_date

    def save(self, *args, **kwargs):
        ... do calculations here ...
        self.calculated_field = 1 + 1 // calculations
        super().save(*args, **kwargs)


    def __str__(self):
        return self.name

因为在交易计算时,views.py是一个很好的地方,即购买,此时价格已达成一致,永远不会改变

如果业务逻辑要求数据更新事务,那么模型更好

视图.py

class PriceForm(forms.ModelForm):
    class Meta:
            model = Price
            fields = ['name', 'contract','time_daily','start_date']
    def price_detail(request):

    if request.method == 'POST':
        form = PriceForm(request.POST)

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


    return render(request, 'main.html', {'form': form})
def price_detail(request):
    form = PriceForm(request.POST or None)

    if form.is_valid():
        price_instance = form.save() // this returns a saved instance
        ... do calculations here ...
        price_instance.calculated_field = 1 + 1 // example calculations
        price_instance.confirmed = False // consider adding a confirmed boolean, to not allow users to alter the data in the next step.
        price_instance.save()

        return render(request, 'confirmation.html', {'price_instance': price_instance})
    else:
        return render(request, 'main.html', {'form': form})
class Price(models.Model):
    year_choice = Choices('1-Year Weekly', '3-Year Weekly','1-Year Fortnightly', '3-Year Fortnightly')
    day_choice = Choices('Full Day', 'Half Day')
    name = models.CharField(max_length=100)
    contract = StatusField(choices_name='year_choice')
    time_daily = StatusField(choices_name='day_choice')
    start_date = models.DateField(default=datetime.now)
    end_date = models.DateField(default=datetime(2021,3,31))
    weeksinyear = 52
    hours = 6.5
    epoch_year = date.today().year
    year_start = date(epoch_year, 1, 4)
    year_end = date(epoch_year, 3, 31)

    @property
    def day_count(self):
        return year_end - self.start_date

    def save(self, *args, **kwargs):
        ... do calculations here ...
        self.calculated_field = 1 + 1 // calculations
        super().save(*args, **kwargs)


    def __str__(self):
        return self.name
每次通过覆盖模型的
save()
方法保存模型时执行计算的示例

型号.py

class PriceForm(forms.ModelForm):
    class Meta:
            model = Price
            fields = ['name', 'contract','time_daily','start_date']
    def price_detail(request):

    if request.method == 'POST':
        form = PriceForm(request.POST)

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


    return render(request, 'main.html', {'form': form})
def price_detail(request):
    form = PriceForm(request.POST or None)

    if form.is_valid():
        price_instance = form.save() // this returns a saved instance
        ... do calculations here ...
        price_instance.calculated_field = 1 + 1 // example calculations
        price_instance.confirmed = False // consider adding a confirmed boolean, to not allow users to alter the data in the next step.
        price_instance.save()

        return render(request, 'confirmation.html', {'price_instance': price_instance})
    else:
        return render(request, 'main.html', {'form': form})
class Price(models.Model):
    year_choice = Choices('1-Year Weekly', '3-Year Weekly','1-Year Fortnightly', '3-Year Fortnightly')
    day_choice = Choices('Full Day', 'Half Day')
    name = models.CharField(max_length=100)
    contract = StatusField(choices_name='year_choice')
    time_daily = StatusField(choices_name='day_choice')
    start_date = models.DateField(default=datetime.now)
    end_date = models.DateField(default=datetime(2021,3,31))
    weeksinyear = 52
    hours = 6.5
    epoch_year = date.today().year
    year_start = date(epoch_year, 1, 4)
    year_end = date(epoch_year, 3, 31)

    @property
    def day_count(self):
        return year_end - self.start_date

    def save(self, *args, **kwargs):
        ... do calculations here ...
        self.calculated_field = 1 + 1 // calculations
        super().save(*args, **kwargs)


    def __str__(self):
        return self.name

提交表单后价格是否可能更改,或者交易是否锁定了价格数据?我希望价格可以更改,我将在将来向用户锁定价格,但不知道我将如何做到这一点。还没有做到这一点:)这样他们可以在以后更新他们的定价。我如何在模型中显示这一点?模型是使用JavaScript触发的,通常附加到submit按钮,用于在模型中而不是视图中进行计算?哦,sry,是的,如果你想显示它,模型和属性方法非常适合。如果要冻结结果,请重写save方法。请记住,每次更新实例时,重写save方法都会重新运行该方法。这可能不是您想要的,因为事务数据将被重新计算,并且可能会更改存储的值。