La vista de usuario de Django afecta al usuario_actual (resuelto)

Resuelto lumba asked hace 8 meses • 1 respuestas

Tengo una URL para ver toda la información sobre un usuario específico:

blog/urls.py (estoy usando 'urlpatterns +=' para dar una parte de la lista de urlpatterns, no está += en mi archivo)

urlpatterns += path('user/<int:pk>/', UserDetailView.as_view(), name='user-detail'),

que utiliza esta vista UserDetailView:

blog/vistas.py

class UserDetailView(DetailView):
    model = User
    template_name = 'blog/user_detail.html'

que hereda de DetailView y utiliza el modelo de usuario de Django.

Tengo una barra de navegación en el archivo html base que muestra el apodo del usuario actual con un enlace a su página adjunto:

base.html (del que heredan todos los demás archivos html)

{% if user.is_authenticated %}
                        <a class="nav-item nav-link" href="{% url 'post-create' %}">New Post</a>
                        <a class="nav-item nav-link" href="{% url 'user-detail' user.id %}">{{ user.username }}</a>
                        <a class="nav-item nav-link" href="{% url 'logout-page' %}">Logout</a>

Ahora, cuando inicio sesión y busco cualquier página excepto 'user/<int:pk>/', el apodo con el enlace se muestra como debería, pero cuando busco la página de un usuario específico, {{ usuario ]} cambia del usuario actual al usuario cuya página estoy buscando. en: imágenes .

ListView con modelo de publicación que llama al usuario por su apodo no afecta al usuario actual:

blog/url.py

urlpatterns += path('user/<str:username>', UserPostListView.as_view(), name='user-posts')

blog/vistas.py

class UserPostListView(ListView):
    model = Post
    template_name = 'blog/user_posts.html'   # <app>/<model>_<viewtype>.html    # blog/post_list.html
    context_object_name = 'posts'
    paginate_by = 2

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return Post.objects.filter(author=user).order_by('-date_posted')


UserPostListView(imagen) .

¿Hay alguna manera de evitar que DetailView con el modelo de usuario cambie {{ usuario }} del usuario actual a la página que estoy viendo?

lumba avatar Feb 16 '24 23:02 lumba
Aceptado

¿Hay alguna manera de evitar DetailViewque el modelo de usuario cambie {{ usuario }} del usuario actual a la página que estoy viendo?

La razón por la que esto sucede es porque Django inyecta el objeto como objecten la plantilla, pero también como resultado de un [Django-doc] que es por defecto el nombre del modelo en minúsculas, por lo que en este caso.get_context_object_name(…) user

Pero podemos obtener el usuario que inició sesión de {{ request.user }}la siguiente manera:

{{ request.user }}  # 🖘 logged-in user
{{ user }}          # 🖘 object of the DetailView
{{ object }}        # 🖘 object of the DetailView

Otra opción es especificar un diferente context_object_name, como:

class UserDetailView(DetailView):
    model = User
    template_name = 'blog/user_detail.html'
    context_object_name = 'the_user'

Entonces trabajamos así con:

{{ request.user }}  # 🖘 logged-in user
{{ user }}          # 🖘 logged-in user
{{ the_user }}      # 🖘 object of the DetailView
{{ object }}        # 🖘 object of the DetailView

Nota : Normalmente es mejor utilizar [Django-doc] para hacer referencia al modelo de usuario que utilizar el modelo  [Django-doc] directamente. Para obtener más información, puede consultar la sección  de referencia del modelo de la documentación [Django-doc] .settings.AUTH_USER_MODEL UserUser

willeM_ Van Onsem avatar Feb 16 '2024 16:02 willeM_ Van Onsem