Django: Как написать представление на основе функции, используемое для URL с параметром

Я изучаю Django, использую представления на основе функций, и у меня возникают трудности со следующим: У меня есть этот путь в urls.py

path('user/<str:username>',views.UserProjectList,name='user-projects')

, который должен показывать все проекты конкретного пользователя (клиента). Для того, чтобы достичь этого, имя пользователя должно быть параметром представления, основанного на функции, однако я не могу понять, как написать такое представление... У меня есть следующее:

def UserProjectList(request,username):
    user = User.objects.get(username=username) #THIS IS WRONG and should return id of the user
    #user = User.objects.filter(username=username) #also wrong

    tag_list = ProjectTagsSQL.objects.all() #ProjectTagsSQL and ProjectSQL are connected
    project_list = ProjectSQL.objects.filter(client=user) #ProjectSQL table has column client_id (pk is id in User) and table contains all the projects

    context = {
        'tagy' : tag_list,
        'projecty' : project_list
    }

    return render(request, 'home_page/user_projects.html', context) #SHOULD THE PARAMETER BE INCLUDED HERE?

Я пытался вдохновиться кодом из class based view, который я нашел в интернете (который работает у меня, но мне не удалось связать его с ProjectTagsSQL, как мне удалось в FBV, но это другая проблема), но у меня не получилось

class UserProjectListView(ListView):
    model = ProjectSQL
    template_name = 'home_page/user_projects.html' 
    context_object_name = 'data'

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return ProjectSQL.objects.filter(client=user)

        # original qs
        qs = super().get_queryset()
        # filter by a variable captured from url, for example
        return ProjectSQL.objects.filter(username=self.kwargs['username'])

        return user

Может кто-нибудь помочь мне, как работать с таким представлением на основе функций? Так как это решение не работает (ничего не возвращает для любого пользователя)

Вам нужно написать user.id так:

from django.shortcuts import get_object_or_404

def UserProjectList(request,username):
    user = get_object_or_404(User,username=username)
    tag_list = ProjectTagsSQL.objects.all()
    project_list = ProjectSQL.objects.filter(client=user.id)

    context = {
        'tagy' : tag_list,
        'projecty' : project_list
    }

    return render(request, 'home_page/user_projects.html', context)

Примечание: Всегда добавляйте / в конце каждого маршрута, поэтому он должен быть path('user/<str:username>/'....

Примечание: Представления, основанные на функциях, обычно пишутся на snake_case, поэтому лучше назвать его user_project_list вместо UserProjectList.

Вернуться на верх