Django CreateView: автоматически устанавливает два поля внешнего ключа в форме - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть модель под названием «Бронирование», в которой события регистрируются между пользователем и экспертом.Я пытаюсь настроить 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, но это не сработало.Спасибо.

1 Ответ

0 голосов
/ 05 декабря 2018

Ответил на мой вопрос с помощью комментария выше.Ответ есть в 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)
...