Получение данных о пользователях на основе ввода имени пользователя в урлах

Я немного новичок в django и работал над своим первым проектом клона instagram в одиночку. Я запутался в месте, где мне нужно было получить данные пользователя на основе 127.0.0.1:8000/username, и я нашел полезный, но бесполезный ответ (для меня) на medium(.com) .Автор использовал представление на основе классов. В представлении на основе классов я не нашел никакой документации по использованию нескольких моделей, сколько я ни искал, поэтому мне пришлось сделать это с помощью представления на основе функций, поскольку я еще не изучил представление на основе классов. Мне нужно было использовать модель поста, модель профиля и модель пользователя для получения данных для страницы профиля.

Этот код как-то сработал, но должен ли я использовать этот вид?

from django.contrib.auth.models import User
from .models import Profile

#profile view
def profile_data(request, username):   
    mydata = User.objects.get(username=username)
    myprofile = Profile.objects.filter(user=mydata)
    mycontext ={'profile': myprofile}
    return render(request,'firstapp/profile.html', context=mycontext)
#in urls.py,
from firstapp import views
path('<str:username>/', views.profile_data , name='profile'),

#in models.py,
from django.contrib.auth.models import User
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,unique=True)
    fullname = models.CharField(max_length=100)
    def __str__(self):
       return self.fullname
In firstapp/profile.html,

<a href="#" class="text-3xl mt-5 text-center">{{user.profile.fullname}}

Но я запутался в том, как прикрепить мою модель профиля в нем. Поэтому я создал это, мое собственное представление на основе функций для этого после нескольких часов исследований. Можно ли это использовать или это приведет к ошибке? Спасибо

Я ожидаю получить новые способы или исправление или дополнение в моем коде, если это возможно.

Кажется, все в порядке, но будьте осторожны с частью url, потому что у вас будут проблемы при добавлении новых urls (например: /login), потому что это может рассматриваться как имя пользователя.

Вы можете избежать этого, отредактировав порядок в ваших urlpatterns, чтобы страница профиля была последней, но теперь у вас возникнет проблема, если пользователь имеет то же имя пользователя, что и url на вашей странице.

Например, если пользователь имеет "login" в качестве имени пользователя, вы не сможете перейти на страницу его профиля.

Решением является использование префикса для страниц профиля (например: /u/<username> или /@<username>).

Некоторые другие улучшения:

    mydata = User.objects.get(username=username)
    myprofile = Profile.objects.filter(user=mydata)

Можно переписать только одним запросом:

    user = User.objects.get(username=username).select_related("profile")
    myprofile = user.profile

См. документацию по select_related: https://docs.djangoproject.com/en/4.1/ref/models/querysets/#select-related

Вы также должны обработать случай, когда пользователь не найден:

    try:
        user = User.objects.select_related("profile").get(username=username)
    except User.DoesNotExist:
        raise Http404("No User matches the given query.")

    myprofile = user.profile
Вернуться на верх