Как инициализировать данные для поля выбора в createview? - PullRequest
0 голосов
/ 30 мая 2020

Я хочу инициализировать данные для поля выбора в моем представлении создания, чтобы ограничить выбор.

Моя модель:

class TimeSlot(models.Model):
    """
    add a timeslot
    """

    DAYS_CHOICES = (
        (0, "Lundi"),
        (1, "Mardi"),
        (2, "Mercredi"),
        (3, "Jeudi"),
        (4, "Vendredi"),
        (5, "Samedi"),
        (6, "Dimanche")
    )

    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    day = models.IntegerField(choices=DAYS_CHOICES, default=0)
    time_start = models.TimeField()
    time_end = models.TimeField()

    class Meta:
        verbose_name = "horaire d'ouverture"
        verbose_name_plural = "horaires d'ouverture"

    def __str__(self):
        return "Horaire d'ouverture"

Мое представление:

class TimeSlotCreateView(CreateView):
    model = TimeSlot
    template_name = "dashboard/createTimeSlot.html"
    success_url = reverse_lazy('dashboard_list_timeslot')
    form_class = CreateTimeSLotForm

    def get_form_kwargs(self):
        kwargs = super(TimeSlotCreateView, self).get_form_kwargs()
        rooms = Room.objects.filter(club=self.request.user.profil.club_administrator)
        kwargs.update({'rooms': rooms})
        return kwargs

Моя форма:

class CreateTimeSLotForm(forms.ModelForm):
    """
    add room
    """
    class Meta():
        model = TimeSlot
        fields = ('room', 'day', 'time_start', 'time_end')

    def __init__(self, rooms, *args, **kwargs):
        super(CreateTimeSLotForm, self).__init__(*args, **kwargs)
        self.fields['room'] = forms.ChoiceField(choices=tuple([(room.pk,room.name) for room in rooms]))

Полевая комната правильно инициализирована, но когда я отправляю форму:

Cannot assign "'1'": "TimeSlot.room" must be a "Room" instance.

Это очень странно, потому что данные POST верны:

-----------------------------26633367911547435358524036933
Content-Disposition: form-data; name="csrfmiddlewaretoken"

xXmjTKTBLT4BvzPyW2yH9GZBPosRMChVtSLR4GHskgOivxchmfWaK6rLEILGkbRP
-----------------------------26633367911547435358524036933
Content-Disposition: form-data; name="room"

1
-----------------------------26633367911547435358524036933
Content-Disposition: form-data; name="day"

0
-----------------------------26633367911547435358524036933
Content-Disposition: form-data; name="time_start"

12:00:00
-----------------------------26633367911547435358524036933
Content-Disposition: form-data; name="time_end"

18:00:00
-----------------------------26633367911547435358524036933--

Я не понимаю, потому что если удалить «get_form_kwargs» в моем представлении и «def init» в моей форме, значение, переданное после отправки, будет таким же (pk комнаты). Это работает так. Но проблема в том, что все комнаты можно выбрать.

РЕДАКТИРОВАТЬ:

Я нахожу решение:

class TimeSlotCreateView(CreateView):
    model = TimeSlot
    template_name = "dashboard/createTimeSlot.html"
    success_url = reverse_lazy('dashboard_list_timeslot')
    form_class = CreateTimeSLotForm

    def get_form_kwargs(self):
        kwargs = super(TimeSlotCreateView, self).get_form_kwargs()
        rooms = Room.objects.filter(club=self.request.user.profil.club_administrator)
        kwargs.update({'club_pk': self.request.user.profil.club_administrator.pk})
        return kwargs



class CreateTimeSLotForm(forms.ModelForm):
    """
    add room
    """
    class Meta():
        model = TimeSlot
        fields = ('room', 'day', 'time_start', 'time_end')

    def __init__(self, club_pk, *args, **kwargs):
        super(CreateTimeSLotForm, self).__init__(*args, **kwargs)
        self.fields['room'].queryset = Room.objects.filter(club__pk=club_pk)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...