Как выполнить вычисления в Django представлениях на основе классов? - PullRequest
0 голосов
/ 29 марта 2020

Я использовал Django представления на основе классов для создания простого веб-приложения. В этом приложении пользователь указывает длину и ширину здания, приложение вычисляет площадь и сохраняет ее в базе данных. После отправки пользователь перенаправляется на страницу «результатов», где он может видеть свои входные данные и результат.

Я не уверен, как реализовать такую ​​функцию вычисления в общих c представлениях.

Мои модели:

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'))

Может кто-нибудь поделиться хорошим примером, связанным с моим вопросом, или помочь мне реализовать эту функцию в моем файле просмотров?

1 Ответ

2 голосов
/ 29 марта 2020

Это можно сделать в методе .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
...