Duha22RUS31. Mai 2022 10:23
Подсчет суммы баллов в 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
EVA25. Dezember 2023 10:30
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
1) я бы рекомендовал убрать default для ForeignKey - это не безопасно
2) форма не совсем понятна (но я хз - не знаю задачи)
3) View, как мне кажется стоит переписать на что-то похожее на
ошибки, если они выявятся на этапе 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
Я не пойму, почему-то я пытаюсь вернуть значения score модели Option.. но он мне возвращает просто имена всех объектов.. тоесть в вопросе на первом скрине видно, что я вводил баллы 4, 0, 0.. а он мне возвращает имена объектов, я не пойму, ка кне просто из бд вывести эти числа, уже столько всего перечитал, пробовал разные способы, никак не пойму(
1) покажите шаблон
2) я не могу понять, что должно отображаться в 3 колонке - баллы за ответ, написанный в 1 колонке или что-то еще?
я бы предложил сделать подругому - разделить логику формирования информации и форму. форму лучше сделать через FormSet
тогда логика будет примерно такая
страница со списком пациентов и ссылкой на форму добавления пацента -> страница пациента с вопросами, ответами, баллами за ответ и суммой баллов + ссылка на форму для заполнения/изменения ответов
если есть код на github, киньте ссылку, я могу сделать PR с тем, что я имею в виду
https://github.com/Duha22RUS/drf4
Вообще в идеале чтобы показывал баллы в зависимости от выбранного ответа)
Третью колонку я вывожу для того, чтобы видеть, что мне возвращается именно баллы. Т.к. сейчас нет смысла писать функцию по подсчету суммы, потому что в queryset возвращает имена объектов, а не значения Integer, хотябы кортеж вывести (4,0,0) типо того.. От этого уже идти к тому, что при выборе ответа начисляется определенное кол-во баллов, чтобы написать функцию суммы баллов по всем ответам на вопросы.. Я даже пытался возвращать в модели int (self) self.score, но это не помогло.. хотя не совсем пойму как обратиться, ведь у меня модель Option где переменная score.. передается в другую модель через ForeignKey
рекомендации по репозитрию:
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. получается, что все они всегда будут ссылаться на первый объект. я не думаю, что такое поведение - то, что вам нужно
мелкие замечания:
/
/templates/
/. чтобы было drf4/amscsait/amscapp/templates/amscapp/
- если используется "date_of_birth", то правильнее было бы поле с датой регистрации назвать "date_of_registration". или наоборот "date_of_birth" -> "birth_date"
- в полях с nation не обязательно делать длину 10 - в бд будут храниться коды (RU, UA, GE, ...)
- хорошей практикой было бы для шаблонов делать путь
я бы делал так:
сделал бы 2 страницы: patient_info.html, куда в контекст передавал бы все Complaint, относящиеся к пациенту (если они есть, иначе - сообщение типа "Анкетирование еще не проводилось"). если ответы есть - показывать кнопку "изменить анекту", иначе - кнопку "провести анкетирование".
если вернуться к самому первому вопросу - тут у вас в поле score передаются вообще все ответы, при этом это - не поле.
Я чуть позже сделаю PR
drf4-master_updated.zip
Спасибо большое)
Я сделал на скорую руку (часа за полтора), так что верстка и прочее - могут быть кривыми, но за python код я уверен.
я буду рад, если вы обратите внимание на практики, которые я там использовал и которые указал выше
если будут вопросы по тому, как что работает - задавайте
хорошо