Как передать имя пользователя в kwargs фильтра Django? - PullRequest
0 голосов
/ 19 сентября 2018

В веб-приложении для получения всех объектов от конкретного пользователя я использую пользователя 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>

Traceback:

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 Ответ

0 голосов
/ 19 сентября 2018

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

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

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

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

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

Кроме того, это, вероятно, все еще не будет работать.Если я правильно понимаю, у вашего Question класса есть ForeignKey к User модели.A 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(<b>user__username</b>=self.kwargs['username'])

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

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

path(
    'm/user/<b><int:userid></b>/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(<b>user_id=self.kwargs['userid']</b>)

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

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