Я пытаюсь создать веб-сайт, на котором публикуются все профили пользователей c. Я использовал AbstractUser
для любых изменений в базовой модели пользователя позже. Я сделал оставшуюся часть пользовательской информации в UserProfile
модели.
На данный момент, независимо от профиля, на который я нажимаю, я вижу только информацию для текущего вошедшего в систему пользователя.
Я впервые использую представления на основе классов, и я думаю, что я отклоняюсь в неверном направлении.
# users/models.py
import uuid # for profile slugs
from django.db import models
from django.conf import settings
from django.db.models.signals import post_save # signal for profile creation
from django.contrib.auth.models import AbstractUser # import base user model for profile
from django.dispatch import receiver
from allauth.account.signals import user_signed_up
class CustomUser(AbstractUser):
pass
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
city = models.CharField(max_length=60, default="")
...
profile_uuid = models.UUIDField(
primary_key=False,
default=uuid.uuid4,
editable=False,
unique=True
) # to use as a "slug" for profiles
def __str__(self):
return self.user.first_name
@receiver(post_save, sender=CustomUser)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
Я пытаюсь использовать profile_uuid
в качестве своего «Слаг» для URL. Он будет выглядеть как «https://example.com/profile/».
# urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('allauth.urls')), # allauth user management
path('profile/', include('users.urls')), # user profiles
path('', include('pages.urls')), # static pages
]
# users/urls.py
from django.urls import path
from .views import UserProfilePageView
app_name = 'users'
urlpatterns = [
path('<profile_uuid>', UserProfilePageView.as_view(), name='user_profile'), # profile page views
]
Функция представления использует profile_uuid
в качестве моего слага, и на него также ссылаются в шаблоне.
# users/views.py
from django.views import generic
from .models import UserProfile
class UserProfilePageView(generic.DetailView):
model = UserProfile
template_name = 'account/profile.html'
slug_field = 'profile_uuid'
slug_url_kwarg = 'profile_uuid'
Я получил несколько ошибок за отсутствующее поле pk
или slug
при его создании, в конце концов я решил использовать UUID в качестве поля слаг. Ссылка на домашней странице (al oop, в которой перечислены все пользователи) использует profile_uuid
в качестве URL, передаваемого в файл users/urls.py
. Я пытаюсь показать информацию, но безуспешно.
# templates/account/home.html
...
{% for p in profile %}
<a href="{% url 'users:user_profile' p.profile_uuid %}">Profile</a>
{% endfor %}
...
# templates/account/profile.html
{% extends '_base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<h1>{{ user_profile.profile_uuid }}</h1>
<p>{{ user_profile.email }}</p>
{% endblock content %}
Выше приведены две попытки получения информации профиля. Очевидно, что электронное письмо будет храниться в модели CustomUser
; Тем не менее, я пытался определить, как бы я вытащил его через OneToOneField, который у меня есть в UserProfile.
Кроме того, должен отображаться profile_uuid
(это в URL), но это не так распечатать на страницу. Я пробовал все варианты вариаций user_profile, userprofile и т. Д. c. без удачи.
Любое направление по этому вопросу будет высоко ценится. Конечным результатом будет (надеюсь) обработчик профиля, который покажет профили других пользователей, а затем нажмите на личный профиль, в котором будут доступны функции редактирования.
Приветствия!