【问题标题】:TypeError: __init__() got multiple values for keyword argument 'view_name'TypeError:__init__() 为关键字参数“view_name”获取了多个值
【发布时间】:2016-02-06 21:52:03
【问题描述】:

我正在使用 Django Rest 框架,但我不确定为什么会收到此错误。

models.py

from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    followers = models.ManyToManyField('self', related_name='followees', symmetrical=False)

class Post(models.Model):
    author = models.ForeignKey(User, related_name = 'posts')
    title = models.CharField(max_length = 255)
    body = models.TextField(blank = True, null = True)

class Photo(models.Model):
    post = models.ForeignKey(Post, related_name = 'photos')
    image = models.ImageField(upload_to = '%Y/%m/%d')

serializers.py

from rest_framework import serializers

from .models import *

class UserSerializer(serializers.ModelSerializer):
    # Getting the list of posts made by particular users using the username.
    posts = serializers.HyperlinkedIdentityField(
        'posts',
        view_name = 'userpost-list',
        lookup_field = 'username'
    )

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'posts',)

class PostSerializer(serializers.ModelSerializer):
    author = UserSerializer(required = False)
    photos = serializers.HyperlinkedIdentityField(
        'photos',
        view_name = 'postphoto-list'
    )

    def get_validated_exclusions(self):
        # Need to exclude 'author' since we'll add that later
        # based off the request user
        exclusions = super(PostSerializer, self).get_validated_exclusions()
        return exclusions + ['author']

    class Meta:
        model = Post

class PhotoSerializer(serializers.ModelSerializer):
    image = serializers.Field('image.url')

    class Meta:
        model = Photo

views.py

from rest_framework import generics, permissions

from .serializers import *
from .models import *

class UserList(generics.ListCreateAPIView):
    model = User
    serializer_class = UserSerializer
    permission_classes = [
        permissions.AllowAny # Publically available to anyone
    ]

class UserDetail(generics.RetrieveAPIView):
    model = User
    serializer_class = UserSerializer
    lookup_field = 'username'

class PostList(generics.ListCreateAPIView):
    model = Post
    serializer_class = PostSerializer
    permission_classes = [
        permissions.AllowAny
    ]

class PostDetail(generics.RetrieveAPIView):
    model = Post
    serializer_class = PostSerializer
    permission_classes = [
        permissions.AllowAny
    ]

class UserPostList(generics.ListAPIView):
    """
    Lists all the posts of a particular User.
    """
    model = Post
    serializer_class = PostSerializer

    def get_queryset(self):
        queryset = super(UserPostList, self).get_queryset()
        return queryset.filter(author__username = self.kwargs.get('username'))

class PhotoList(generics.ListCreateAPIView):
    model = Photo
    serializer_class = PhotoSerializer
    permission_classes = [
        permissions.AllowAny
    ]

class PhotoDetail(generics.RetrieveAPIView):
    model = Photo
    serializer_class = PhotoSerializer
    permission_classes = [
        permissions.AllowAny
    ]

class PostPhotoList(generics.ListAPIView):
    model = Photo
    serializer_class = PhotoSerializer

    def get_queryset(self):
        queryset = super(PostPhotoList, self).get_queryset()
        return queryset.filter(post__pk = self.kwargs.get('pk'))

urls.py 在我的应用目录中

from django.conf.urls import patterns, url, include

from .views import *

urlpatterns = [
    # User URLs
    url(r'^users/$', UserList.as_view(), name='user-list'),
    url(r'^users/(?P<username>[0-9a-zA-Z_-]+)/$', UserDetail.as_view(), name='user-detail'),
    url(r'^users/(?P<username>[0-9a-zA-Z_-]+)/posts/$', UserPostList.as_view(), name='userpost-list'),

    # Post URLs
    url(r'^posts/$', PostList.as_view(), name='post-list'),
    url(r'^posts/(?P<pk>\d+)/$', PostDetail.as_view(), name='post-detail'),
    url(r'^posts/(?P<pk>\d+)/photos/$', PostPhotoList.as_view(), name='postphoto-list'),

    # Photo URLs
    url(r'^photos/$', PhotoList.as_view(), name='photo-list'),
    url(r'^photos/(?P<pk>\d+)/$', PhotoDetail.as_view(), name='photo-detail'),
]

当我尝试在终端或 runserver 上运行检查命令时,我收到以下错误: TypeError: init() 为关键字参数“view_name”获取了多个值

我到底做错了什么,我该如何解决这个问题?

【问题讨论】:

  • 如果您有其他问题,您应该将其作为一个新问题提出,(完成您的尝试和研究以解决它)。如果 Daniel Roseman 的回答帮助解决了这个问题,您应该考虑接受它

标签: django django-rest-framework


【解决方案1】:

HyperlinkedIdentityField 的第一个参数是 view_name。您传递了一个额外的初始参数,它似乎与字段名称相同;删除此参数。

【讨论】:

  • 等一下,我必须删除第二个参数,因为第一个参数已经完成了完全相同的工作。我理解的对吗?
  • 不,删除第一个;您想将 view_name 设置为指向“userpost-list”,例如,而不是“posts”。
  • 嘿,这似乎已经解决了第一个问题,所以谢谢,但是现在,我收到了另一个错误,我在第一篇文章中更新了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多