невозможно получить kwargs из get_queryset ListView - PullRequest
1 голос
/ 23 июня 2019

Я хочу получить pk или идентификатор каждого сообщения в 'views.py', чтобы я мог использовать его для фильтрации и получения дополнительных данных в 'get_context_data' (В конце концов, я хочу проверить доступ пользователя, вошедшего в систему в данный момент, ккаждый пост).При запуске веб-сайта отображается сообщение об ошибке «KeyError at / post».

В чем может быть проблема в этом?

Я пытался применить пример на официальном сайте django (https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-display/).
Я не увидел существенной разницы между этим примером и моим.

views.py

class PostList(ListView):
    model = Post
    template_name = 'post/post_list.html'

    def get_queryset(self):
        self.post = get_object_or_404(Post, pk=self.kwargs['pk'])
        return Post.objects.filter(pk=self.post)

    def get_context_data(self, **kwargs):
         context = super(PostList, self).get_context_data(**kwargs)
         context['post_info'] = self.post
         context['check_access'] = Access.objects.filter(sender
         return context

post / urls.py

urlpatterns = [
   path('<int:pk>', PostList.as_view(), name='post_list'),
]

Я ожидал увидеть pk или id каждого сообщения, но вместо этого он показывает ниже:

self.post = get_object_or_404(Post, pk=self.kwargs['pk']) ...
▼ Local vars
Variable    Value
args    
()
kwargs  
{}
self    
<post.views.PostList object at 0x107ab0ba8>

1 Ответ

0 голосов
/ 23 июня 2019

Ну, в URL отсутствует первичный ключ. Вы должны включить его, как:

urlpatterns = [
    path('<b><int:pk></b>', PostList.as_view(), name='post_list'),
]

Затем вы можете запросить это с помощью:

localhost:8000/post/123

с 123 первичным ключом, для которого вы хотите получить данные.

Это, однако, не выглядит как ListView [Django-doc] . ListView следует использовать при рендеринге списка объектов. Это больше похоже на DetailView [Django-doc] .

Приятной особенностью DetailView является то, что он даже автоматически фильтрует первичный ключ и слаг. Он автоматически вызовет ответ 404. Если такого объекта не существует.

Так что вы, вероятно, хотите использовать:

class <b>PostDetailView</b>(<b>DetailView</b>):
    model = Post
    <b>context_object_name = 'post'</b>
    template_name = 'post/post_list.html'

    def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context['check_access'] = Access.objects.filter(...)
         return context

context_object_name [Django-doc] указывает имя переменной шаблона для этого объекта.

...