Duha22RUS
Duha22RUSMay 31, 2022, 10:23 a.m.

Подсчет суммы баллов в 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)
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

10
Илья Чичак
  • June 1, 2022, 3:48 a.m.
  • (edited)

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
    • June 1, 2022, 12:50 p.m.

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

      Илья Чичак
      • June 2, 2022, 4:56 a.m.

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

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

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

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

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

        Duha22RUS
        • June 2, 2022, 6:19 a.m.

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

          Duha22RUS
          • June 3, 2022, 10:16 a.m.

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

            Илья Чичак
            • June 3, 2022, 10:31 a.m.

            рекомендации по репозитрию:
            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

              Илья Чичак
              • June 3, 2022, 12:39 p.m.
              • The answer was marked as a solution.

              drf4-master_updated.zip drf4-master_updated.zip

                Duha22RUS
                • June 3, 2022, 1:27 p.m.

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

                  Илья Чичак
                  • June 3, 2022, 4:44 p.m.

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

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

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

                    Duha22RUS
                    • June 3, 2022, 10:33 p.m.
                    • (edited)

                    хорошо

                      Comments

                      Only authorized users can post comments.
                      Please, Log in or Sign up
                      AD

                      C ++ - Test 004. Pointers, Arrays and Loops

                      • Result:50points,
                      • Rating points-4
                      m

                      C ++ - Test 004. Pointers, Arrays and Loops

                      • Result:80points,
                      • Rating points4
                      m

                      C ++ - Test 004. Pointers, Arrays and Loops

                      • Result:20points,
                      • Rating points-10
                      Last comments
                      ИМ
                      Игорь МаксимовNov. 23, 2024, 1:51 a.m.
                      Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                      Evgenii Legotckoi
                      Evgenii LegotckoiNov. 1, 2024, 3:37 a.m.
                      Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                      A
                      ALO1ZEOct. 19, 2024, 9:19 p.m.
                      Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                      ИМ
                      Игорь МаксимовOct. 5, 2024, 8:51 p.m.
                      Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                      d
                      dblas5July 6, 2024, 12:02 a.m.
                      QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                      Now discuss on the forum
                      Evgenii Legotckoi
                      Evgenii LegotckoiJune 25, 2024, 4:11 a.m.
                      добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                      t
                      tonypeachey1Nov. 15, 2024, 8:04 p.m.
                      google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                      NSProject
                      NSProjectJune 4, 2022, 4:49 p.m.
                      Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                      9
                      9AnonimOct. 25, 2024, 10:10 p.m.
                      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                      Follow us in social networks