Как передать имя пользователя в kwargs фильтра Django?

В веб-приложении для получения всех объектов от конкретного пользователя я использую пользователя pk. Но чтобы сделать URL более читабельным, я хочу использовать имя пользователя. Проблема в представлении django, пользователь pk в kwargs дает правильные значения, но когда я использую имя пользователя, это показывает ошибку.

Вот мои коды, использующие 'username' в качестве kwargs, который возвращает keyerror,

views.py

class UserAllQuestionView(generic.ListView):
    model = Question
    template_name = 'mechinpy/user_profile_question.html'
    context_object_name = 'user_all_questions'

    def get_queryset(self):
        return Question.objects.filter(user=self.kwargs['username'])

urls.py

path('m/user/<str:slug>/questions/', views.UserAllQuestionView.as_view(), name='user_profile_question_all'),

HTML

 <a href="{% url 'mechinpy:user_profile_question_all' user.username %}">All User Questions</a>

Проследить:

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\base.py" in dispatch
  88.         return handler(request, *args, **kwargs)

File "C:\Users\Bidhan\AppData\Local\Programs\Python\Python35\lib\site-packages\django\views\generic\list.py" in get
  142.         self.object_list = self.get_queryset()

File "C:\Users\Bidhan\Desktop\Startup\mysite\mechinpy\views.py" in get_queryset
  454.         return Question.objects.filter(user=self.kwargs['username'])

Exception Type: KeyError at /m/user/bidhan/questions/
Exception Value: 'username'

1 ответ

Решение

Несоответствие в именах параметров URL

Если я правильно понимаю ваш вопрос, вы передаете имя пользователя в виде slug для представления, например:

path(
    'm/user/<str:slug>/questions/',
    views.UserAllQuestionView.as_view(),
    name='user_profile_question_all'
),

Вы называете этот параметр slug однако, по вашему мнению, вы звоните self.kwargs['username'], Таким образом, вам нужно изменить один из двух. Например:

path(
    'm/user/<str:username>/questions/',
    views.UserAllQuestionView.as_view(),
    name='user_profile_question_all'
),

Кроме того, это, вероятно, все еще не будет работать. Если я правильно понимаю, ваш Question класс имеет ForeignKey к User модель. User не совпадает с его текстовым представлением (например, с помощью username), поэтому фильтр будет выглядеть так:

class UserAllQuestionView(generic.ListView):
    model = Question
    template_name = 'mechinpy/user_profile_question.html'
    context_object_name = 'user_all_questions'

    def get_queryset(self):
        return Question.objects.filter(user__username=self.kwargs['username'])

С использованием user_id вместо

При этом, может быть, лучше id из User вместо этого, что, скорее всего, приведет к меньшей путанице (например, что если пользователю удастся использовать имя пользователя с косой чертой в нем, то URL-адрес больше не будет работать). Таким образом, более безопасный подход может быть:

path(
    'm/user/<int:userid>/questions/',
    views.UserAllQuestionView.as_view(),
    name='user_profile_question_all'
),
class UserAllQuestionView(generic.ListView):
    model = Question
    template_name = 'mechinpy/user_profile_question.html'
    context_object_name = 'user_all_questions'

    def get_queryset(self):
        return Question.objects.filter(user_id=self.kwargs['userid'])

и в шаблоне напишите это как:

<a href="{% url 'mechinpy:user_profile_question_all' userid=user.id %}">All User Questions</a>
Другие вопросы по тегам