Django профиль пользователя показывает только авторизованные данные пользователя - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь создать веб-сайт, на котором публикуются все профили пользователей 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. без удачи.

Любое направление по этому вопросу будет высоко ценится. Конечным результатом будет (надеюсь) обработчик профиля, который покажет профили других пользователей, а затем нажмите на личный профиль, в котором будут доступны функции редактирования.

Приветствия!

1 Ответ

0 голосов
/ 24 марта 2020

DetailView отобразит экземпляр модели в шаблоне как object согласно документации .

Измените шаблон на:

<h1>{{ object.profile_uuid }}</h1>
<p>{{ object.user.email }}</p>
...