【问题标题】:Django: 'str' object has no attribute 'get'Django:'str'对象没有属性'get'
【发布时间】:2021-06-11 15:15:51
【问题描述】:

我正在尝试有效地制作 Reddit 克隆,只是为了使用 Django 进行练习,并且我正在尝试仅使用一个简单的整数来设置我的赞成/反对票系统(赞成票加一,反对票减一)但是当我点击“赞成票”时" 或 "downvote" 按钮它给了我错误'str' object has no attribute 'get'。我不知道是什么原因造成的,与此错误有关的所有其他答案都完全不相关,任何帮助都会很棒。 完整追溯:

Traceback (most recent call last):
  File "C:\Users\Andre\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Andre\AppData\Local\Programs\Python\Python37\lib\site-packages\django\utils\deprecation.py", line 116, in __call__
    response = self.process_response(request, response)
  File "C:\Users\Andre\AppData\Local\Programs\Python\Python37\lib\site-packages\django\middleware\clickjacking.py", line 26, in process_response
    if response.get('X-Frame-Options') is not None:
AttributeError: 'str' object has no attribute 'get'

我的模特:

class post(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    ranking = models.IntegerField(default=0)

我的观点:

class Feed(ListView):
    model = post
    template_name = 'thefeed/feed.html'

def UpvoteView(request, pk):
    selected_post = post.objects.get(pk=pk)
    selected_post.ranking+=1
    selected_post.save()
    return reverse('feed-home')

def DownvoteView(request, pk):
    selected_post = post.objects.get(pk=pk)
    selected_post.ranking-=1
    selected_post.save()
    return reverse('feed-home')

我的网址:

urlpatterns = [
    path('', views.Feed.as_view(), name="feed-home"),
    path('post/<int:pk>/downvote', views.DownvoteView, name='downvote-post'),
    path('post/<int:pk>/upvote', views.DownvoteView, name='upvote-post'),
]

我的 Feed.html(主页):

{% block content %}
<div class="announcement">
    <h5 style="background: yellow;">Forum.Chat is the Internet's home for debate on any topic, keep it civil!</h5>
</div>
<br>
{% for post in object_list %}
    <div style="margin-bottom: 2%;">
        <h3><a href="{% url 'feed-post' post.pk %}">{{post.title}}</a><a href="#"></h3>
        <p><a href="#">By: {{post.author}}</a><a href="{% url 'edit-post' post.pk %}">    Edit Post</a></p>
        <p><a href="{% url 'upvote-post' pk=post.pk %}">Upvote</a><a href="{% url 'downvote-post' pk=post.pk %}">    DownVote</a></p>
    </div>
{% endfor %}
{% endblock %}

【问题讨论】:

  • edit 并将完整错误回溯添加到您的问题中。
  • @AbdulAzizBarkat 我会更新它。
  • return reverse('feed-home') 你为什么要返回一个网址?你应该返回一些response

标签: python python-3.x django django-models django-views


【解决方案1】:

在你的观点中你写return reverse('feed-home'),但这将返回一个字符串作为名为@9​​87654324@的url模式的url。视图应该始终返回一个响应对象。作为快捷方式,您可以使用 redirect [Django docs] 返回一个重定向用户的响应:

from django.shortcuts import redirect


def UpvoteView(request, pk):
    selected_post = post.objects.get(pk=pk)
    selected_post.ranking+=1
    selected_post.save()
    return redirect('feed-home')  # Change here

def DownvoteView(request, pk):
    selected_post = post.objects.get(pk=pk)
    selected_post.ranking-=1
    selected_post.save()
    return redirect('feed-home')  # Change here

注意:类名最好在PascalCase而不是snake_case,函数/变量名也应该在snake_case 不是PascalCase。因此,而不是 post 您的模型应该是 命名为 Post 而不是 UpvoteView 它应该是 upvote_view等看看PEP 8 -- Style Guide for Python Code

【讨论】:

  • 感谢关于不同情况的说明,我会更新它们。将其更改为重定向现在有效,即使我单击 upvote 它仍然会降低分数。任何想法为什么会发生这种情况?
  • @Agarb 啊,这是因为您将两种 url 模式的视图都设置为 views.DownvoteView,您希望将 'post/&lt;int:pk&gt;/upvote' 的视图设置为 views.UpvoteView
【解决方案2】:

你可以这样试试吗:

def UpvoteView(request, pk):
    selected_post = post.objects.get(pk=pk)
    selected_post.ranking = selected_post.ranking +1
    selected_post.save()
    return reverse('feed-home')

你能得到 post.objects.all()

【讨论】:

  • 试过了,我得到了同样的错误,我可以得到 post.objects.all()
  • 您是否为模型使用自定义管理器?在错误日志中请注意代码的行号。 selected_post = post.objects.get(pk=pk) - 这是导致错误的行吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 2014-04-28
  • 2020-12-11
  • 1970-01-01
  • 2014-05-12
  • 2021-05-22
  • 1970-01-01
相关资源
最近更新 更多