'Keyerror at /' при передаче пользователя с первичным ключом в наборе запросов для просмотра списка - PullRequest
0 голосов
/ 23 сентября 2019

models.py

class Notes(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_added = models.DateTimeField(default=timezone.now)

views.py

class HomepageView(ListView):
    model = Notes
    template_name = "home.html"

    def get_queryset(self):
        return Notes.objects.filter(Q(author=self.kwargs['pk']))

Указывает, что pk имеет KeyError, есть ли способизбавиться от этого заранее спасибо ...!

1 Ответ

0 голосов
/ 23 сентября 2019

self.kwargs содержит параметры, которые находятся в пути URL.Таким образом, в вашем urls.py вы должны определить что-то вроде:

# urls.py

from app.views import HomePageView

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

Затем вы можете посетить страницу с действительным первичным ключом, например, /14, если 14 является действительным первичным ключом.для User.

Если вы хотите использовать зарегистрированного пользователя вместо этого, вы должны использовать self.request.user вместо:

# in case you want to use the logged in user

django.views.generic.list import ListView
from django.contrib.auth.mixins import LoginRequiredMixin

class HomepageView(LoginRequired, ListView):
    model = Notes
    template_name = 'home.html'

    def get_queryset(self):
        return Notes.objects.filter(author=self.request.user)

Примечание : может быть лучше использовать get_user_model [Django-doc] для указания на пользовательскую модель, поскольку, если вы позже измените пользовательскую модель, изменение внешних ключей будет проще.

Примечание : Вы можете рассмотреть возможность использования DateTimeField(auto_now_add=True) вместоmodels.DateTimeField(default=timezone.now), так как это сделает поле недоступным для редактирования и т. д.

...