Я хочу инициализировать данные для поля выбора в моем представлении создания, чтобы ограничить выбор.
Моя модель:
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)