Использование имени пользователя вместо идентификатора пользователя для доступа к профилю пользователя

#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.