На основе выбора модели отображать результат в шаблоне django
на основе поля множественного выбора я хочу показать результат в шаблоне но я понятия не имею как это сделать как вы можете видеть в этой модели я даю выбор обеда ученикам на основе выбора обеда я хочу показать результат но это не работает например если он выберет сэндвич то результат после отправки будет готов сэндвич и тоже самое для других
from multiselectfield import MultiSelectField
class student(models.Model):
lunch_choice = [
('Sandwich', 'Sandwich'),
('Salad', 'Salad'),
('omlete', 'omlete'),
]
name = models.CharField(max_length=70, blank=False)
classs = models.CharField(max_length70, blank=True)
lunch = multiselectfield(choices=lunch_choice, blank=True)
def __str__(self):
return self.name
я попробовал в своем HTML
{% if student.classs %}
{% if student.lunch == 'Sandwich' %}
<p> your sandwich will be ready</p>
{% endif %}
{%endif%}
OP может создать модель для обедов (это позволит создавать новые обеды, редактировать и удалять). Затем в модели Student создайте обед с ManyToManyField
, например
lunch = models.ManyToManyField(Lunch, blank=True)
Обратите внимание на использование blank=True
для того, чтобы не требовать наличия поля в формах.
Тогда, когда вы создадите форму на основе этой модели, она создаст опыт, подобный тому, который есть в Django Admin, где можно выбрать несколько вариантов.
Затем можно показать его пользователю в шаблоне.
Если вам не нравится работа с формой и вы хотите сделать ее более удобной для пользователя, есть несколько статей, объясняющих это
Это происходит потому, что строка сравнивается с типом: type(aaa[0].lunch) <class 'multiselectfield.db.fields.MSFList'>. Вывел тип данных 'type(aaa[0].lunch)' первого значения из базы данных в представлении. Использовал stringformat:'s' для преобразования данных в строку в шаблоне. Здесь вы можете прочитать о преобразовании: conversion
трансформация тип:
замените 'samplesite' на имя вашего приложения.
urls.py
urlpatterns = [
path("Test/", Test, name = 'Test'),
]
views.py
def Test(request):
aaa = student.objects.all()
print('type(aaa[0].lunch)', type(aaa[0].lunch))
context = {'fff': aaa}
return render(request, 'samplesite/lunch.html', context)
lunch.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
</head>
<body>
{% for aa in fff %}
{% if aa.lunch|stringformat:'s' == 'Sandwich' %}
<p>{{aa.lunch}}</p>
{% endif %}
{% endfor %}
</body>
</html>
acc мне кажется, что нет такого способа, с помощью которого вы можете показать результат на основе выбранного варианта, потому что я также пытался использовать это и искал ответы в интернете, но не нашел ничего, и создатель этого репозитория также не отвечает, хотя я бы рекомендовал вам использовать модели many to many field Это позволит пользователю выбрать более одного варианта, как multiselectfield, как это
сначала создайте модели
class Lunch(models.Model):
title = models.CharField(max_length=200)
def __str__(self):
return self.title
добавьте это в модели ученика
lunch = models.ManyToManyField(Lunch, blank=True, related_name="lunch")
затем добавьте свой вариант в модель обеда
и вставьте его в ваш шаблон, чтобы показать результат на основе выбранной опции
{% if student.classs %}
{% for Lunch in student.lunch.all %}
{% if Lunch.title == 'Sandwich' %}
<p> your sandwich will be ready</p>
{% endif %}
{% endfor %}
{%endif%}
это будет работать