Сохранение и отображение нескольких флажков в 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, и все работает идеально.

Вернуться на верх