Как запросить в представлении django добавить два числа? - PullRequest
0 голосов
/ 23 марта 2020

Я хочу запросить в view.py , чтобы я мог отобразить сумму двух целых чисел, введенных клиентом. Кажется, я не могу найти способ добавить числа, введенные клиентом, и отобразить их на сервере. Любое предложение о том, как подойти к этой проблеме, будет очень полезным. Если какой-либо запрос, связанный с вопросом, пожалуйста, задайте, я постараюсь сделать его более понятным.

Models.py ::

from django.db import models
from django.conf import settings
class Addition(models.Model):
    name = models.CharField(max_length=10)
    int1 = models.IntegerField()
    int2 = models.IntegerField()
     **Edited Section**
    @property
    def total_score(self):
        total = self.int1+self.int2
        return total

Form.py: :

from django import forms
from . models import Addition
class AdditionForm(forms.ModelForm):
    class Meta:
        model = Addition
        fields = [
            'name',
            'int1',
            'int2',
        ]

Serializer.py ::

from rest_framework import serializers
from . models import Addition, Subtraction
class AdditionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Addition
        fields = '__all__'

View.py ::

from django.shortcuts import get_list_or_404,render
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from . forms import AdditionForm
from . models import Addition
from . serializers import AdditionSerializer
from .forms import SubtractionForm
from . models import Subtraction
from . serializers import SubtractionSerializer

class AdditionList(APIView):
    def get(self,request):
        additions = Addition.objects.all()
        serializer = AdditionSerializer(additions,many = True)
        return Response(serializer.data)
class AdditionListForm(APIView):
    def post(request):
        form = AdditionForm(request.POST or None)
        if form.is_valid():
            form.save()
            form =AdditionForm()
        return render(request,'add/addition_form.html',{'form':form})

1 Ответ

1 голос
/ 24 марта 2020

Если ваш вопрос «где мне сделать сложение», то нет «чисто технического» ответа - это технически законно и обоснованно, если вы поставите это в своем представлении, в вашей форме, в вашем сериализаторе, в вашей модели или даже в отдельной функции в пакете третьей части, если хотите.

НО там есть четкий ответ от дизайна POV. Хорошо структурированное приложение отделяет уровень домена от пользовательского интерфейса - уровень домена НЕ должен зависеть от интерфейса пользователя.

В Django пользовательский интерфейс состоит из представлений / сериализаторов (если вы создаете API REST) ​​/ templates / forms, а уровень домена в моделях в основном связан с уровнем доступа к данным (не обязательно хотя в классах Model - некоторые части лучше реализованы как автономные функции или классы).

IOW, в вашем случае, предоставление результата сложения явно является ответственностью вашей модели Addition. Это не означает, что вам следует добавить поле базы данных result в вашу модель (это нарушит правила нормализации реляционной модели), просто добавьте метод get_result(self) (или, поскольку операция здесь довольно дешевая, result property). Вам, конечно, придется настроить ваш сериализатор et c для возврата этого результата с вашими данными.

Примечание: вы также можете использовать аннотации orm Django, чтобы делегировать добавление в вашу базу данных (RDBMs). не просто для хранения данных, они могут выполнять довольно много операций с вашими данными, и чаще всего гораздо быстрее, чем чистый код Python). Это, конечно, немного излишне, но, поскольку это игрушечный учебный проект, вы можете попробовать это сделать и в образовательных целях.

В качестве общего руководства: ваш уровень домена должен обеспечивать все доменные логи c и ничего не знают об уровне пользовательского интерфейса, поэтому вы можете использовать его с различными пользовательскими интерфейсами (традиционный http / html пользовательский интерфейс, API отдыха, сценарии командной строки, собственный GUI и т. д.), и пользовательский интерфейс должен обрабатывать только презентацию / пользователя логи взаимодействия c и делегировать все остальное домену.

...