如何被授权使用 django rest framework 和 CreateAPIView 创建对象?

how to be authorized to create an object using django rest framework and CreateAPIView?

当我想使用 CreateAPIView 创建对象时遇到问题,我收到消息: "detail": "Authentication credentials were not provided.".

我使用 rest-auth 和 rest-authtoken 应用程序。

这是我目前所做的:

models.py

class CustomUser(AbstractUser):
    objects = CustomUserManager()
    is_normal_user = models.BooleanField(default=False)
    is_corporate_user = models.BooleanField(default=False)

class CompanyProfile(models.Model):
    user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    corporate_name = models.CharField(max_length=30)

serializers.py

class CompanyProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = CompanyProfile
        fields = ['user', 'corporate_name',]
        read_only_fields = ('id',)

views.py

class Authorized_Company_User(permissions.BasePermission):
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_corporate_user)

class CompanyCreateProfileView(generics.CreateAPIView):
    #queryset = CompanyProfile.objects.all()
    serializer_class = CompanyProfileSerializer
    #authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated, Authorized_Company_User)

请问是否需要定义create函数,使用get方法获取用户authtoken

"detail": "Authentication credentials were not provided."

此消息是由 permission_classes = IsAuthenticated

您需要提供一个 Token 才能创建。

从 rest_auth 添加这个 url 应用:

re_path(r'^rest_auth/',include('rest_auth.urls'))

然后就可以使用postman做测试了

method :POST
url: http://127.0.0.1:8000/rest_auth/login/
body: {"username":"user", "password":"password"}
headers: Content-Type: Application/json

作为回应你得到

`{"key":"here your token"}`

使用此令牌您可以添加新用户

method :POST
url: http://127.0.0.1:8000/add_user_url/
body: {"corporate_name":"corporate"}
headers: Content-Type: Application/json
         Authorization: "Token ########here your token########"

并且在您的 CreateAPIView 中,您可以分配用户:

class CompanyCreateProfileView(generics.CreateAPIView): 
    def perform_create(self, serializer):
            serializer.save(user=self.request.user)