Django CreateView: автоматически устанавливает два поля внешнего ключа в форме

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

Какой точно вы установили и что именно произошло? Откуда должно исходить значение?

Daniel Roseman 05.12.2018 18:06

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

user6210879 05.12.2018 19:06

Что ж, второй из них должен был сработать. Что случилось, когда вы это попробовали? Какую ошибку вы получили?

Daniel Roseman 05.12.2018 19:36

Вы правы, второй вариант действительно работает! Я запутался, потому что раскрывающееся меню все еще отображалось в форме. Думаю, мне просто нужно исключить его из формы. Бронирование работает, как указано. Благодаря тонну!

user6210879 05.12.2018 20:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
571
1

Ответы 1

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

Другие вопросы по теме