在Django中显示用户的所有帖子

时间:2018-08-16 09:14:02

标签: python django

我想获取用户发送的所有帖子。例如用户:admin,它将显示管理员的帖子。我写了一些代码,但可能是我犯了一个错误,但出现了一个错误。 我得到的错误:

AttributeError at /index_page/

'WSGIRequest' object has no attribute 'models'

这是我的代码:

views.py

def index_page(request):
    logged_in_user = request.models.author
    logged_in_user_posts = Post.objects.filter(author=user)

    return render(request, 'blog/post_list.html', {'posts': logged_in_user_posts})

models.py

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = RichTextField()
    created_date = models.DateTimeField(
        default=timezone.now)
    published_date = models.DateTimeField(
        blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

post_list.html

<div>
{% for post in posts %}

    Username: {{ post.author.username }}
    Post: {{ post.text }}

    <br>

{% endfor %}

我的错误在哪里?

3 个答案:

答案 0 :(得分:4)

该错误已提示该行:

    logged_in_user = request.models.author

request对象具有 no models属性。它具有一个.user属性,用于指定已登录的用户,因此您可以使用:

    logged_in_user = request.user

还有另一个错误:您使用Post.objects.filter(user=user),但是也没有user变量,而是有logged_in_user变量。因此,您可以使用以下方法修复视图:

def index_page(request):
    logged_in_user_posts = Post.objects.filter(author=request.user)
    return render(request, 'blog/post_list.html', {'posts': logged_in_user_posts})

其他笔记

  1. 因为您需要用户,所以用login_required decorator [Django-doc]装饰功能很有意义;和
  2. 由于Django允许您更改 User模型,因此使用standard way to refer to the user model [Django-doc]可能会有所帮助。如果您以后改变主意并实现另一个用户模型,则创建的迁移将自动让关系引用新模型。

上面的两个注释不是严格才能使其起作用。但这是我在开发Django应用程序时的良好做法(尽管这些当然可能有点“基于观点”)。

答案 1 :(得分:1)

问题出在您的视图中,请求对象不包含您的模型。该视图应如下所示,

def index_page(request):
    logged_in_user = request.user
    logged_in_user_posts = Post.objects.filter(author=logged_in_user)
    return render(request, 'blog/post_list.html', {'posts': logged_in_user_posts})

答案 2 :(得分:0)

我的回答有点晚了,但以后可能会对某人有所帮助。您可以使用基于类的视图。你的情况

views.py:

class UserPostListView(ListView):
    model = Post
    template_name = 'app_name/template_name.html'
    context_object_name = 'posts'

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

并在您的 urls.py 中:

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

然后在您的模板中:

{% block content%}
<h1> My files </h1>
       {% for post in posts %}

               



       {% endfor %}
          {% endblock %}