У меня есть модель под названием «Бронирование», в которой события бронируются между пользователем и экспертом. Я пытаюсь настроить CreateView для бронирования, чтобы он автоматически знал текущего пользователя и специалиста, профиль которого посещал пользователь, чтобы этих двух пользователей не нужно было выбирать из раскрывающихся меню в форме бронирования. Я могу успешно сделать это для текущего пользователя, переопределив метод form_valid, но не знаю, как это сделать для эксперта.
models.py:
class Booking(models.Model):
user = models.ForeignKey(CustomUser, null=True, default='', on_delete=models.CASCADE)
expert = models.ForeignKey(CustomUser, null=True, default='',on_delete=models.CASCADE, related_name='bookings')
title = models.CharField(max_length=200, default='Video call with ..', null=True)
start_time = models.DateTimeField('Start time', null=True)
end_time = models.DateTimeField('End time', null=True)
notes = models.TextField('Notes', help_text='Please provide some detail on what you would like to learn or discuss', blank=True, null=True)
views.py:
class BookingView(CreateView):
model = Booking
form_class = BookingForm
def form_valid(self, form):
form.instance.user = self.request.user
return super(BookingView, self).form_valid(form)
urls.py:
urlpatterns = [
#path('', include('booking.urls')),
path('signup/', views.SignUp.as_view(), name='signup'),
path('login/', auth_views.LoginView.as_view(), {'authentication_form': LoginForm}, name='login'),
path('profile/', views.view_profile, name='profile'),
path('profile/<int:pk>/', views.view_profile, name='profile_with_pk'),
path('profile/<int:pk>/booking/', BookingView.as_view(), name='user_booking_new'),
path('profile/edit/', views.EditProfileView, name='edit_profile'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Я пробовал установить form.instance.expert в метод form_valid, но это не сработало. Спасибо.
Я попытался добавить строку: form.instance.expert = CustomUser.objects.get (pk = pk), а также попробовал form.instance.expert = CustomUser.objects.get (id = self.kwargs.get ('pk') ), но ни один из них не работал. Значение pk - это пользовательский pk (в данном случае эксперт, как вы можете видеть в URL-адресе view_profile). Когда пользователь посещает профиль и хочет зарезервировать этого эксперта, я хочу, чтобы pk для этого профиля пользователя каким-то образом автоматически передавался в форму, чтобы форма бронирования знала, кто уже является экспертом, если это имеет смысл.
Что ж, второй из них должен был сработать. Что случилось, когда вы это попробовали? Какую ошибку вы получили?
Вы правы, второй вариант действительно работает! Я запутался, потому что раскрывающееся меню все еще отображалось в форме. Думаю, мне просто нужно исключить его из формы. Бронирование работает, как указано. Благодаря тонну!






Ответил на мой вопрос с помощью комментария выше. Ответ находится в views.py:
class BookingView(CreateView):
model = Booking
form_class = BookingForm
def form_valid(self, form):
form.instance.user = self.request.user
form.instance.expert = CustomUser.objects.get(id=self.kwargs.get('pk'))
return super(BookingView, self).form_valid(form)
Какой точно вы установили и что именно произошло? Откуда должно исходить значение?