Сохранение и отображение нескольких флажков в Django ModelMultipleChoiceField
Я начинающий на django 2.2 и не могу правильно отправить несколько вариантов в базу данных. В моей таблице полей дни хранятся следующим образом:
['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
Моя форма :
CHOICESDAY = (("Monday", "Monday"),
("Tuesday", "Tuesday"),
("Wednesday", "Wednesday"),
("Thursday", "Thursday"),
("Friday", "Friday"),
("Saturday", "Saturday"),
("Sunday", "Sunday")
)
class FgtScheduleForm(forms.ModelForm):
days = forms.MultipleChoiceField(required=True,
choices=CHOICESDAY,
widget=forms.CheckboxSelectMultiple(
attrs={'class': 'checkbox-inline'}))
class Meta:
model = FgtSchedule
fields = ('name','days')
widgets = {
'name': forms.TextInput(attrs={
'class': 'form-control form-form '
'shadow-none td-margin-bottom-5'}),
}
fields = ('name', 'days')
Моя модель
class FgtSchedule(models.Model):
days = models.CharField(max_length=100, blank=True)
Мое мнение:
def fg_schedule_list(request):
list_fg_sch = FgtSchedule.objects.all()
return render(request, 'appli/policy/fg_schedule.html',
{'list_fg_sch': list_fg_sch})
Мой шаблон
{% for fg_sch_list in list_fg_sch %}
<tr>
<td>{{ fg_sch_list.id }}</td>
<td>{{ fg_sch_list.name }}</td>
<td>{{ fg_sch_list.days|replace_days }}</td>
</tr>
{% endfor %}
Мои пользовательские теги :
@register.filter
def replace_days(value):
CHOICESDAY = {"Monday": "Monday",
"Tuesday": "Tuesday",
"Wednesday": "Wednesday",
"Thursday": "Thursday",
"Friday": "Friday",
"Saturday": "Saturday",
"Sunday": "Sunday"}
return CHOICESDAY[value]
Проблема в том, что когда я хочу отобразить позже все дни, у меня есть KeyError at "['1', '2']"
Проблема в том, что функция replace_days ожидает значение типа "1", а вы передаете массив ['1','2']. Вы должны передавать значения по одному или изменить функцию replace_days.
Вы можете изменить эту строку:
<td>{{ i.days|replace_days }}</td>
И сделайте что-то вроде этого:
<td>{% for day in i.days %}{{day|replace_days}}{% endfor %}</td>
Я нашел решение в этом посте : https://stackoverflow.com/a/61723003/18406204
Используя это расширение!
Я выполняю итерации, как сказал @LaCharcaSoftware, и все работает идеально.