Выбор радиоэлемента в представлении редактирования Шаблон Django
Я делаю представление редактирования и хочу, чтобы при получении результатов выбирались некоторые радиополя. Моя проблема в том, что я не могу сделать так, чтобы мои значения в forloop и значения из базы данных корректно сравнивались. Позвольте мне быть более ясным с некоторым кодом. У меня есть списки с именами mission_entry и gradings. mission_entry имеет некоторые оценки внутри него, голос от 1 до 5 в каждом значении списка.
views.py
mission_entry = MissionEntry.objects.filter(log_entry_id=log_entry_id)
gradings = range(1,6)
models.py
GRADING_VALUE = (
('1', '1'),
('2', '2'),
('3', '3'),
('4', '4'),
('5', '5'),
)
class MissionEntry(models.Model):
student = models.ForeignKey(
Student, on_delete=models.DO_NOTHING, blank=True, null=True)
mission = models.ForeignKey(
Mission, on_delete=models.DO_NOTHING, null=True, blank=True)
log_entry = models.ForeignKey(
LogEntry, on_delete=models.CASCADE, blank=True, null=True)
learning_objective = models.ForeignKey(
LearningObjective, on_delete=models.DO_NOTHING, blank=True, null=True)
grade = models.CharField(
max_length=10, choices=GRADING_VALUE, blank=True, null=True)
comment = models.TextField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
шаблон
{% for lo in mission_entry %}
<tr>
<td id='learning_obj'>{{lo.learning_objective.name}}</td>
{% for grade in gradings %}
<td>
<input class="form-check {{grade}}" {% if lo.grade == grade %}selected{% endif %} type="radio" value="{{grade}}" name="grade{{lo.learning_objective.name}}" id="grade" required/>
</td>
{% endfor %}
<td><input type="text" class="form-control" name="note" id='note' value="{{lo.comment}}"></td>
</tr>
{% endfor %}
Я знаю, что {% if lo.grade == grade %}selected{% endif %} - это неправильный кусок кода. В основном я сравниваю в шаблоне строку с целым числом, но я не могу понять, как манипулировать моими переменными для их сравнения. Есть предложения?
Как вы заметили, вы сравниваете строки с целыми числами, поэтому это не работает. Вы можете изменить gradings на строки вместо целых чисел:
gradings = map(str, range(1, 6))
Where map преобразует каждый элемент в итерабле в строку.
В качестве альтернативы вы можете изменить поле grade на IntegerField вместо CharField. Это будет более уместно, если вы собираетесь хранить только целочисленные значения, и будет лучше подходить для таких вещей, как упорядочивание элементов по grade в будущем.