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
.