La vista de usuario de Django afecta al usuario_actual (resuelto)
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?
¿Hay alguna manera de evitar
DetailView
que 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 object
en 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
User
User