【问题标题】:How to perform calculations in Django class-based views?如何在基于 Django 类的视图中执行计算?
【发布时间】:2020-03-29 00:25:36
【问题描述】:

我使用 Django 基于类的视图来创建一个简单的 Web 应用程序。在这个应用程序中,用户提交建筑物的长度和宽度,应用程序计算面积并将其存储在数据库中。提交后,用户将被重定向到“结果”页面,在那里他可以看到他的输入和结果。

我不确定如何在通用视图中实现这样的计算功能。

我的模特:

from django.db import models


class Building(models.Model):

    length = models.IntegerField(default=1)
    width = models.IntegerField(default=1)
    area = models.IntegerField(default=1)

    def __str__(self):
        return self.name

我的表格:

from django import forms
from .models import Building

class BuildingForm(forms.ModelForm):
    class Meta:
        model = Building
        fields = ('length', 'width', 'area')

我的观点:

from django.views.generic import ListView, CreateView, UpdateView
from django.urls import reverse, reverse_lazy
from .models import Building
from .forms import BuildingForm
from django.http import HttpResponseRedirect, HttpResponse


class BuildingListView(ListView):
    model = Building
    context_object_name = 'buildings'


class BuildingCreateView(CreateView):
    model = Building
    form_class = BuildingForm
    success_url = reverse_lazy('results')


class BuildingUpdateView(UpdateView):
    model = Building
    form_class = BuildingForm
    success_url = reverse_lazy('building_changelist')


def calculation(request):

    length = request.POST.get('length', False)
    width = request.POST.get('width', False)
    area = length * width
    Building.objects.create(length=length, width=width, area=area,)

    return HttpResponseRedirect(reverse('results'))

有人可以分享一个与我的问题相关的好例子,或者帮助我在我的视图文件中实现这个功能吗?

【问题讨论】:

标签: python django django-generic-views


【解决方案1】:

您可以在 .form_is_valid() 方法中执行此操作:

class BuildingCreateView(CreateView):
    model = Building
    form_class = BuildingForm
    success_url = reverse_lazy('results')

    def form_valid(self, form):
        resp = super().form_valid(form)
        form.instance.area = form.length * form.width
        form.save()
        return resp

但是最好在模型中进行计算(每次保存模型都会保存面积):

class Building(models.Model):

    length = models.IntegerField(default=1)
    width = models.IntegerField(default=1)
    area = models.IntegerField(default=1)

    def __str__(self):
       return self.name

    def save(self, *args, **kwargs):
       self.area = self.length * self.width 
       super().save(*args, **kwargs)

甚至可以在每次调用时计算,无需保存到数据库中:

class Building(models.Model):

    length = models.IntegerField(default=1)
    width = models.IntegerField(default=1)

    def __str__(self):
       return self.name

    @property
    def area(self):
       return self.lenght * self.width

【讨论】:

  • 谢谢!在您的第一个解决方案中,该行的最后一部分:form.instance.area = form.length * form.area 应该是form.width。另外,我认为在计算时间方面,在视图中执行计算比在模型中更好?
  • 感谢您修复错字!我正在遵循“Two Scoops of Django”中的“Fat Models、Thin Views、Helper 函数和愚蠢的模板”的座右铭。此外,在 save 方法中保存它会使该区域默认计算,而不仅仅是在一个特定视图中。
猜你喜欢
  • 2019-08-29
  • 2018-05-14
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 2014-02-16
  • 2011-11-10
相关资源
最近更新 更多