Получение данных о пользователях на основе ввода имени пользователя в урлах
Я немного новичок в 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