Почему представление на основе FormView (CBV) не имеет параметра URL в контексте? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть представление на основе классов, которое должно принять отправку формы.Я пытаюсь автоматически заполнить некоторые поля формы, используя первичный ключ в пути URL (например, / main / video / play / 135).Представление на основе классов основано на FormView, код, который у меня есть, делает pk доступным в контексте, если я использую TemplateView, но это не особенно хорошо для обработки форм.

urls.py

app_name = 'main'
urlpatterns = [
    #path('', views.index, name='index'),
    path('video/<int:pk>', views.VideoDetailView.as_view(), name='detail'),
    path('video/preview/<int:pk>', views.VideoPreview.as_view(), name='preview'),
    path('player', views.PlayerListView.as_view(), name='player_list'),
    path('video/play/<int:pk>/', views.VideoPlayView.as_view(), name='play'),
    path('', views.VideoListView.as_view(), name="video_list")
]

Соответствующий класс из views.py:

class VideoPlayView(FormView):

    template_name = "main/video_play.html"
    form_class = VideoPlayForm
    initial = {}
    http_method_names = ['get', 'post']

    def get_initial(self, **kwargs):
        initial = super().get_initial()
        #initial['video'] = pk
        initial['watch_date'] = datetime.date.today()
        return initial

    def get_context_data(self, **kwargs):
        kc = kwargs.copy()
        context = super().get_context_data(**kwargs)
        video = Video.objects.get(context['pk'])
        context['video'] = video
        context['test'] = kc
        self.initial['video'] = video.pk
        context['viewers'] = Viewer.objects.all()
        context['players'] = Player.objects.filter(ready=True)
        return context

    def form_valid(self, form):
        return HttpResponse("Done")

Я получаю ключевую ошибку в строке:

video = Video.objects.get(context['pk'])

Просмотр отладочной информации на странице ошибки указывает, что контекст нев нем хранится значение pk.

Если я изменяю базовый класс на TemplateView с FormMixin, я не получаю эту ключевую ошибку (но у меня возникают проблемы с размещением данных формы), поэтому я знаю, чтоКод в основном хорошо.Насколько я понимаю, класс FormView должен заполнять контекст таким же образом, как и класс TemplateView.

Любая идея, почему FormView ведет себя так и как я могу заставить это работать?

1 Ответ

2 голосов
/ 24 апреля 2019

Если вы хотите pk из URL, self.kwargs['pk'] будет работать во всех общих представлениях Django на основе классов.

В TemplateView метод get() передает kwargs методу get_context_data, поэтому вы можете использовать context['pk']. Метод FormView get() вызывает get_context_data() без прохождения kwargs, поэтому он не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...