Duha22RUS
Duha22RUS31 травня 2022 р. 10:23

Подсчет суммы баллов в Django

django, Django

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

На форму выводятся все вопросы из бд
Что-то типо такого

Ну или может я совсем не по тому пути пошёл

#models.py
class Question(models.Model):
    name = models.CharField('Вопрос', max_length=100)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Вопрос'
        verbose_name_plural = 'Вопросы'


class Option(models.Model):
    name = models.CharField('Вариант ответа', max_length=100)
    score = models.IntegerField('Количество баллов', default=0)
    option = models.ForeignKey(Question, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Поле для выбора'
        verbose_name_plural = 'Поля для выборов'


class Complaint(models.Model):
    name = models.ForeignKey(to=Patient, on_delete=models.CASCADE, default=1)
    question = models.ForeignKey(to=Question, on_delete=models.CASCADE, default=1)
    option = models.ForeignKey(to=Option, on_delete=models.CASCADE, default=1)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Анкетирование'
        verbose_name_plural = 'Анкетирования'
#forms.py
class OptionForm(ModelForm):
    series = ModelChoiceField(label='Ответ', queryset=Option.objects.all())
    pat = ModelChoiceField(label='Пациент', queryset=Patient.objects.order_by('name'))
    score = Option.objects.order_by('score')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['option'].queryset = Option.objects.none()

    class Meta:
        model = Complaint
        fields = ('__all__')
#views.py
def add_complaint(request):
    error = ''
    if request.method == 'POST':
        form = OptionForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('database_home')
        else:
            error = 'Ошибка добавления'

    compla = Question.objects.order_by('name')
    # score = Option.objects.order_by('score')
    # ball = Option.objects.filter(option_id=score)
    form = OptionForm()
    data = {'form': form, 'error': error, 'compla': compla}
    return render(request, 'database/add_complaint.html', data)
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

10
Илья Чичак
  • 01 червня 2022 р. 03:48
  • (відредаговано)

1) я бы рекомендовал убрать default для ForeignKey - это не безопасно
2) форма не совсем понятна (но я хз - не знаю задачи)
3) View, как мне кажется стоит переписать на что-то похожее на

def add_complaint(request):
    form = OptionForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('...')
    context = {'form': form, ...}
    return render(request, ..., context)

ошибки, если они выявятся на этапе form.is_valid можно обработать в шаблоне через https://docs.djangoproject.com/en/4.0/ref/forms/api/#django.forms.Form.add_error . они будут информативнее

по поводу основного вопроса:
https://docs.djangoproject.com/en/4.0/topics/db/aggregation/
https://docs.djangoproject.com/en/4.0/ref/models/querysets/#sum

    Duha22RUS
    • 01 червня 2022 р. 12:50

    Я не пойму, почему-то я пытаюсь вернуть значения score модели Option.. но он мне возвращает просто имена всех объектов.. тоесть в вопросе на первом скрине видно, что я вводил баллы 4, 0, 0.. а он мне возвращает имена объектов, я не пойму, ка кне просто из бд вывести эти числа, уже столько всего перечитал, пробовал разные способы, никак не пойму(

      Илья Чичак
      • 02 червня 2022 р. 04:56

      1) покажите шаблон
      2) я не могу понять, что должно отображаться в 3 колонке - баллы за ответ, написанный в 1 колонке или что-то еще?

      я бы предложил сделать подругому - разделить логику формирования информации и форму. форму лучше сделать через FormSet

      тогда логика будет примерно такая

      страница со списком пациентов и ссылкой на форму добавления пацента -> страница пациента с вопросами, ответами, баллами за ответ и суммой баллов + ссылка на форму для заполнения/изменения ответов

      если есть код на github, киньте ссылку, я могу сделать PR с тем, что я имею в виду

        Duha22RUS
        • 02 червня 2022 р. 06:19

        https://github.com/Duha22RUS/drf4
        Вообще в идеале чтобы показывал баллы в зависимости от выбранного ответа)

          Duha22RUS
          • 03 червня 2022 р. 10:16

          Третью колонку я вывожу для того, чтобы видеть, что мне возвращается именно баллы. Т.к. сейчас нет смысла писать функцию по подсчету суммы, потому что в queryset возвращает имена объектов, а не значения Integer, хотябы кортеж вывести (4,0,0) типо того.. От этого уже идти к тому, что при выборе ответа начисляется определенное кол-во баллов, чтобы написать функцию суммы баллов по всем ответам на вопросы.. Я даже пытался возвращать в модели int (self) self.score, но это не помогло.. хотя не совсем пойму как обратиться, ведь у меня модель Option где переменная score.. передается в другую модель через ForeignKey

            Илья Чичак
            • 03 червня 2022 р. 10:31

            рекомендации по репозитрию:
            1) использовать poetry для упраления зависимостями (или хотябы pip freeze)
            2) добавить .gitignore и добавить туда папку .idea
            3) у вас то английский, то русский текст по коду. я бы порекомендовал писать только на английском, а для русского использовать переводы Django
            4) избавиться от city_dropdown_list_options.html - правильнее это поместить в форму
            5) сделать один шаблон для форм - шаблоны login и register - одинаковые, кроме текста в кнопке. правильнее было бы передавать его из view через контекст
            6) сделать заполнение анкеты через ModelFormSet
            7) тут у вас не передается id пациента. непонятно, к кому это будет относиться.
            8) тут в кнопке нет ссылки
            9) тут правильнее это поле назвать patient. name - всетаки больше подходит для CharField
            10) тут я бы назвал поле "Национальность", а не "нация". и ChoiceNation - сделал бы в единственном числе.
            11) тут название поля, по-моему, не верное. правильнее было бы назвать его question. всетаки вариант ответа ссылается на вопрос, а не на вариант ответа.
            12) в модели Complient лучше убрать default. получается, что все они всегда будут ссылаться на первый объект. я не думаю, что такое поведение - то, что вам нужно

            мелкие замечания:
            - если используется "date_of_birth", то правильнее было бы поле с датой регистрации назвать "date_of_registration". или наоборот "date_of_birth" -> "birth_date"
            - в полях с nation не обязательно делать длину 10 - в бд будут храниться коды (RU, UA, GE, ...)
            - хорошей практикой было бы для шаблонов делать путь / /templates/ /. чтобы было drf4/amscsait/amscapp/templates/amscapp/

            я бы делал так:
            сделал бы 2 страницы: patient_info.html, куда в контекст передавал бы все Complaint, относящиеся к пациенту (если они есть, иначе - сообщение типа "Анкетирование еще не проводилось"). если ответы есть - показывать кнопку "изменить анекту", иначе - кнопку "провести анкетирование".


            если вернуться к самому первому вопросу - тут у вас в поле score передаются вообще все ответы, при этом это - не поле.

            Я чуть позже сделаю PR

              Илья Чичак
              • 03 червня 2022 р. 12:39
              • Відповідь була позначена як рішення.

              drf4-master_updated.zip drf4-master_updated.zip

                Duha22RUS
                • 03 червня 2022 р. 13:27

                Спасибо большое)

                  Илья Чичак
                  • 03 червня 2022 р. 16:44

                  Я сделал на скорую руку (часа за полтора), так что верстка и прочее - могут быть кривыми, но за python код я уверен.

                  я буду рад, если вы обратите внимание на практики, которые я там использовал и которые указал выше

                  если будут вопросы по тому, как что работает - задавайте

                    Duha22RUS
                    • 03 червня 2022 р. 22:33
                    • (відредаговано)

                    хорошо

                      Коментарі

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      Дмитрий

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:60бали,
                      • Рейтинг балів-1
                      Дмитрий

                      C++ - Тест 003. Условия и циклы

                      • Результат:92бали,
                      • Рейтинг балів8
                      d
                      • dsfs
                      • 26 квітня 2024 р. 14:56

                      C++ - Тест 004. Указатели, Массивы и Циклы

                      • Результат:80бали,
                      • Рейтинг балів4
                      Останні коментарі
                      k
                      kmssr09 лютого 2024 р. 05:43
                      Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                      АК
                      Анатолий Кононенко05 лютого 2024 р. 12:50
                      Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                      EVA
                      EVA25 грудня 2023 р. 21:30
                      Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                      J
                      JonnyJo25 грудня 2023 р. 19:38
                      Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                      G
                      Gvozdik19 грудня 2023 р. 08:01
                      Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                      Тепер обговоріть на форумі
                      G
                      George1307 травня 2024 р. 10:27
                      добавить qlineseries в функции в функции: "GPlotter::addSeries(QString title, QVector &arr)" я вызываю метод setChart(...), я в конструктор передал адрес на QChartView элемент
                      BlinCT
                      BlinCT05 травня 2024 р. 15:46
                      Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                      PS
                      Peter Son04 травня 2024 р. 03:57
                      Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
                      Evgenii Legotckoi
                      Evgenii Legotckoi03 травня 2024 р. 00:07
                      Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
                      IscanderChe
                      IscanderChe30 квітня 2024 р. 14:22
                      Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

                      Слідкуйте за нами в соціальних мережах