【问题标题】:Django error: 'WSGIRequest' object has no attribute 'post' for commentsDjango 错误:'WSGIRequest' 对象没有用于评论的属性'post'
【发布时间】:2020-04-22 05:41:47
【问题描述】:

我是 django 的新手,我正在开发一个博客应用程序并尝试为帖子启用 cmets。当我从管理页面编写 cmets 时,一切正常,但作为用户,我收到以下错误:'WSGIRequest' 对象没有属性'post'。搜索类似的问题我看到大多数人将 request.Post 切换为 request.POST 但我的代码中没有,我将 view for comment 写为一个类而不是 def comment(request)... 我该如何解决这个问题?

views.py 中的代码:

class PostDetailView(DetailView):
    model = Post

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = [title, summary, content, image]

    def form_valid(self, form):
        form.instance.author= self.request.user
        return super().form_valid(form)

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    fields = ['content']

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.post = self.request.post
        return super().form_valid(form)

models.py 中的代码:

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['created']

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

    def __str__(self):
        return 'Comment of user {}: {}'.format(self.user, self.content)
class Post(models.Model):
    title= models.CharField(max_length=100)
    summary= models.TextField(max_length=200, default='defalut text ...')
    content= models.TextField()
    image= models.ImageField(default='default.png', upload_to='post_pics')
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        img = Image.open(self.image.path)
        img.save(self.image.path)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

来自 post_detail.html:

{% extends "recepti/base.html" %}
{% block content %}
  <article class="media content-section">
    <img class="rounded-circle article-img" src="{{ object.author.profile.image.url }}">
    <div class="media-body">
      <div class="article-metadata">
        <a class="mr-2" href="{% url 'user-posts' object.author.username %}">{{ object.author }}</a>

        <small class="text-muted">{{ object.date_posted|date:"F d, Y" }}</small>
        <small class="">{{ object.comments.count }}</small>  <i class="fa fa-comment"></i>
        <small>0</small>  <i class="fa fa-heart"></i><br>


        {% if object.author == user %}
          <div>
            <a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'post-update' object.id %}">Update</a>
            <a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'post-delete' object.id %}">Delete</a>
          </div>
        {% endif %}
      </div>

      <h2 class="article-title">{{ object.title}}</h2>
      <p class="article-title">{{ object.summary}}</p>
      <img src="{{ object.image.url }}">
      <p class="article-content">{{ object.content}}</p>
      <div class="btn-group" role="group" aria-label="Basic example">
          <button type="button" class="btn btn-secondary">Like</button>
          <a class="nav-item nav-link" href="{% url 'post-comment' %}">New comment</a>

        </div>
        <hr>
        {% for comment in object.comments.all %}

        <h5>{{ comment.user }}</h5>
        <h6>{{ comment.created }}</h6>
        <p>{{ comment.content }}</p>

        {% empty %}
        <p> No comments</p>
        {% endfor %}
    </div>

  </article>

{% endblock content %}

来自 urls.py 的代码:

urlpatterns = [

    path('', PostListView.as_view(), name='recepti-home'),

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

    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),

    path('post/new/', PostCreateView.as_view(), name='post-create'),

    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),

    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),

    path('post/comment/', CommentCreateView.as_view(), name='post-comment'),

    path('about/', views.about, name='recepti-about')

]

comment_form.html 中的代码:

{% extends "recepti/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <form method="POST">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">New comment</legend>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Submit</button>
        </div>
    </form>
</div>
{% endblock content %}

【问题讨论】:

  • django 怎么知道你在评论哪个帖子?
  • @bmons 我认为这是如何将评论链接到帖子? ---> 在视图中:form.instance.post = self.request.post 和在模型中:post = models.ForeignKey(Post, related_name='cmets', on_delete=models.CASCADE)

标签: python django post comments blogs


【解决方案1】:

这里有几个小问题;首先,您需要一种方法来指定帖子,该帖子将以某种方式发表评论。您可以为此目的使用 post 的主键。所以你需要改变网址,如:

urls.py

path('post/<int:post_pk>/comment/', CommentCreateView.as_view(), name='post-comment'),

并更改表单的action 属性:

模板

{% extends "recepti/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
<div class="content-section">
    <form method="POST" action="{% url 'post-comment' object.pk %}">       <-------------
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">New comment</legend>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Submit</button>
        </div>
    </form>
</div>
{% endblock content %}

(根据您用于呈现此模板的方法,您可能需要将post.pk 替换为object.pk 或类似的东西)

最后,在 views.py 中,您可以使用 self.kwargs 访问帖子的主键:

class CommentCreateView(LoginRequiredMixin, CreateView):
    model = Comment
    fields = ['content']

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.instance.post = self.kwargs.get('post_pk')
        return super().form_valid(form)

【讨论】:

  • 我在问题中添加了 post 模型,基于这个模型我如何知道如何访问 Post 模型的主键?
  • @Rea 请添加呈现帖子详细信息视图(包含 cmets 部分的页面)的视图函数/类。
【解决方案2】:

我猜“帖子”与 Comment.post 相关,与您使用的方法无关。

所以评论包含 4 个字段(其中一个是自动字段),但您在字段中仅列出了“评论” - 添加其他字段或使用模型表单

【讨论】:

    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多