Как передать имя пользователя в 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>