Duha22RUS
Duha22RUSМамыр 31, 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
Илья Чичак
  • Маусым 1, 2022, 3: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
    • Маусым 1, 2022, 12:50 Т.Қ.

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

      Илья Чичак
      • Маусым 2, 2022, 4:56 Т.Ж.

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

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

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

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

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

        Duha22RUS
        • Маусым 2, 2022, 6:19 Т.Ж.

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

          Duha22RUS
          • Маусым 3, 2022, 10:16 Т.Ж.

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

            Илья Чичак
            • Маусым 3, 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

              Илья Чичак
              • Маусым 3, 2022, 12:39 Т.Қ.
              • Жауап шешім ретінде белгіленді.

              drf4-master_updated.zip drf4-master_updated.zip

                Duha22RUS
                • Маусым 3, 2022, 1:27 Т.Қ.

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

                  Илья Чичак
                  • Маусым 3, 2022, 4:44 Т.Қ.

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

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

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

                    Duha22RUS
                    • Маусым 3, 2022, 10:33 Т.Қ.
                    • (өңделген)

                    хорошо

                      Пікірлер

                      Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                      Кіріңіз немесе Тіркеліңіз
                      m
                      • molni99
                      • Қаз. 26, 2024, 11:37 Т.Ж.

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

                      • Нәтиже:80ұпай,
                      • Бағалау ұпайлары4
                      m
                      • molni99
                      • Қаз. 26, 2024, 11:29 Т.Ж.

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

                      • Нәтиже:20ұпай,
                      • Бағалау ұпайлары-10

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

                      • Нәтиже:42ұпай,
                      • Бағалау ұпайлары-8
                      Соңғы пікірлер
                      i
                      innorwallҚар. 10, 2024, 3:31 Т.Қ.
                      QMYSQL драйверін құру (MariaDB) Windows 10 x64 QT 5.13.0 Mingw73_64 amazon priligy Conclusion This is the first study of the adverse effects of quetiapine ingestion by children under 7 years of age
                      i
                      innorwallҚар. 10, 2024, 10:14 Т.Ж.
                      ТОБЖ – Сабақ 002. Оптикалық талшық және оның түрлері can you buy priligy Uric acid reduction rectifies prehypertension in obese adolescents
                      i
                      innorwallҚар. 10, 2024, 7:59 Т.Ж.
                      Audiere кітапханасымен mp3 файлдарын ашу Cook meat all the way through priligy otc Note stages 2 3 AKI here exclude patients on dialysis, which are shown in a separate bar graph
                      i
                      innorwallҚар. 9, 2024, 11:34 Т.Қ.
                      Qt/C++ - 017-сабақ. QGraphicsScene немесе Qt тілінде графикамен жұмыс істеу жолы Sort of the world congress on only the fluid seen attached to conceive where to buy priligy in malaysia Depressive symptoms have been associated with digoxin in small trials and case …
                      Енді форумда талқылаңыз
                      i
                      innorwallҚар. 10, 2024, 7:22 Т.Қ.
                      добавить qlineseries в функции The information provided in Dosage Posology and method of administration of Tamoxifen Actavis is based on data of another medicine with exactly the same composition as the Tamoxifen Actavis …
                      9
                      9AnonimҚаз. 25, 2024, 7:10 Т.Қ.
                      Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                      F
                      FynjyШілде 22, 2024, 2:15 Т.Қ.
                      при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                      Бізді әлеуметтік желілерде бақылаңыз