#python #django #django-models #django-views #django-urls
#python #django #django-модели #django-представления #django-urls
Вопрос:
Как я могу получить доступ к объекту модели по имени пользователя вместо идентификатора или как я могу преобразовать имя пользователя в идентификатор, который затем можно использовать для доступа к объекту модели?
У меня есть представление, подобное приведенному ниже, где передаваемым аргументом является user_username:
views.py
def profile_page(request, user_username):
form = FollowUserForm(request)
profile = Profile.objects.get(user=user_username)
return render(request, "network/profilePage.html", {
"form": form,
"profile": profile
})
Я знаю, что мы не можем присвоить пользователю значение, равное user_username, так есть ли способ каким-либо образом преобразовать имя пользователя в идентификатор, который я затем могу использовать для доступа к соответствующему объекту профиля? Я делаю это так, потому что в моем urls.py Я хочу, чтобы URL-адрес показывал имя пользователя пользователя, а не просто идентификатор номера.
urls.py
path("profile/<str:user_username>", views.profile_page, name="profile"),
Отредактировано для добавления:
models.py
class User(AbstractUser):
pass
class Profile(models.Model):
user = models.OneToOneField("User", on_delete=models.CASCADE, primary_key=True)
friends = models.ManyToManyField("User", related_name='following', blank=True, symmetrical=False)
Ответ №1:
Вы можете фильтровать username
пользователя с помощью:
from django.shortcuts import get_object_or_404
def profile_page(request, user_username):
profile = get_object_or_404(Profile, user__username=user_username)
form = FollowUserForm(request)
return render(request, 'network/profilePage.html', {
'form': form,
'profile': profile
})
Примечание: часто лучше использовать
get_object_or_404(…)
[Django-doc],
а затем использовать.get(…)
[Django-doc] напрямую. В случае, если объект не существует,
например, потому, что пользователь сам изменил URL-адрес,get_object_or_404(…)
это приведет к возврату ответа HTTP 404 Not Found, тогда как использование
.get(…)
приведет к ошибке сервера HTTP 500.