【问题标题】:get() got an unexpected keyword argument 'pk': djangoget() 得到了一个意外的关键字参数“pk”:django
【发布时间】:2020-08-18 18:55:27
【问题描述】:

我正在为我的 django 博客创建类似按钮,我导入 api 以使用 django rest 框架中的 ajex,但我收到错误,因为错误是 get() got an unexpected keyword argument 'pk' django

view.py

class PostLikeToggle(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
          obj = get_object_or_404(Post, pk=kwargs['pk'])
          url_ = obj.get_absolute_url()
          user = self.request.user
          if user.is_authenticated:
             if user in obj.likes.all():
                obj.likes.remove(user)
             else:
                obj.likes.add(user)
          return url_

   from rest_framework.views import APIView
   from rest_framework.response import Response
   from rest_framework import authentication, permissions
   from django.contrib.auth.models import User

   class PostLikeApiToggle(APIView):

        authentication_classes = [authentication.SessionAuthentication]
        permission_classes = [permissions.IsAuthenticated]

        def get(self, request, format=None):
            usernames = [user.username for user in User.objects.all()]
            return Response(usernames)

    def get_redirect_url(self, *args, **kwargs):
            obj = get_object_or_404(Post, pk=kwargs['pk'])
            url_ = obj.get_absolute_url()
            user = self.request.user
            updated = False
            liked =False
            if user.is_authenticated:
               if user in obj.likes.all():
                  liked = False
                  obj.likes.remove(user)
               else:
                   liked = True
                   obj.likes.add(user)
            updated = True
            data = {
                   "updated":updated,
                    "liked":liked
                   }

           return Response(data)

urls.py

    path('blog/<int:pk>/like/', PostLikeToggle.as_view(),name='Like-Toggle'),
    path('blog/api/<int:pk>/like/', PostLikeApiToggle.as_view(),name='Like-Api-Toggle'),

models.py

class Post(models.Model):

     title = models.CharField(max_length=200)
     author = models.ForeignKey(User,on_delete=models.CASCADE)
     likes =models.ManyToManyField(User,blank=True,related_name='post_likes')
     content = models.TextField()
     img = models.ImageField(upload_to='pics',blank=True)
     time = models.DateTimeField(default=timezone.now)

     def __str__(self):
        return self.title

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

    def get_like_url(self):
       return reverse('Like-Toggle', kwargs={'pk':self.pk})

    def get_api_like_url(self):
       return reverse('Like-Api-Toggle', kwargs={'pk':self.pk})

有人可以帮我 get() 在那个错误中得到一个意外的关键字参数 'pk'

【问题讨论】:

  • 你怎么调用get_redirect_url函数??
  • 你能更正你的缩进吗?像这样读起来很难。
  • 带重定向视图
  • 现在可以了吗? @Exelian
  • 不,不是。见models.py

标签: django django-models django-rest-framework django-views django-urls


【解决方案1】:

错误非常明显。 get 方法缺少参数。 为了解决这个问题:

class PostLikeApiToggle(APIView):
    ...
    def get(self, request, pk, format=None):

为什么会出现这个错误?

您的urls.py 将路径定义为'blog/&lt;int:pk&gt;/like/'。 Django 将解析该 url 并调用视图的方法 - 在您的情况下获取 - 使用组名称/值作为关键字参数 - 有关 Django 如何处理请求的更多详细信息,请参阅the point 4 of the documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2021-10-25
    • 2021-08-05
    • 1970-01-01
    • 2020-05-01
    • 2018-05-02
    相关资源
    最近更新 更多