Как передать имя пользователя текущего авторизованного пользователя на URL? питон джанго - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить все сообщения от одного пользователя и отобразить их с помощью DetailView, а также хочу передать имя пользователя пользователя в URL.

это мой urls.py:

from django.urls import path
from .views import ProfileDetail
from . import views

urlpatterns = [
   path('<str:username>/', ProfileDetail.as_view(), name = 'profile'),
]

это мои views.py:

from django.views.generic import (DetailView)
from django.shortcuts import render , redirect, get_object_or_404
from django.contrib.auth.models import User
from blog.models import Post


class ProfileDetail(DetailView):
    model = Post
    template_name = 'users/myprofile.html'
    context_object_name = 'posts'
    paginate_by = 5

    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')

У меня есть представление на основе классов, почти такое же, как и это, и оно работает. Этот всегда дает мне эту AttributeError: Generic detail view ProfileDetail must be called with either an object pk or a slug in the URLconf.

1 Ответ

1 голос
/ 02 апреля 2019

Если вы хотите отобразить несколько сообщений, то лучше подойдет ListView с model = Post.

from django.views.generic import ListView

class ProfileDetail(List):
    model = Post
    template_name = 'users/myprofile.html'
    context_object_name = 'posts'
    paginate_by = 5

    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')

В качестве альтернативы, если вы хотите использовать DetailView, тогда у вас должно быть model = User, потому что вы показываете сообщения для одного пользователя. Вы можете избежать ошибки «должен быть вызван с помощью объекта pk или slug», переопределив get_object.

from django.views.generic import DetailView

class ProfileDetail(ListView):
    model = User
    template_name = 'users/myprofile.html'

    def get_object(self):
        return User.objects.get(username=self.kwargs['username'])

Затем в шаблоне вы можете перебирать сообщения пользователя с помощью чего-то вроде:

{% for post in user.post_set.all %}
{{ post }}
{% endfor %}

Обратите внимание, что при переключении на DetailView вы теряете функции нумерации страниц ListView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...