我有一个使用 Django REST 框架构建的简单视图:
class ProductListCreateAPIView(
StaffEditorPermissionMixin,
generics.ListCreateAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def perform_create(self, serializer):
print(serializer.validated_data)
name = serializer.validated_data.get('name')
description = serializer.validated_data.get('description') or None
if description is None:
description = name
serializer.save(description=description)
这是 StaffEditorPermissionMixin:
class StaffEditorPermissionMixin():
permission_classes = [permissions.IsAdminUser, IsStaffEditorPermission]
这是 ProductSerializer:
class ProductSerializer(serializers.ModelSerializer):
edit_url = serializers.SerializerMethodField(read_only=True)
url = serializers.HyperlinkedIdentityField(
view_name='product-details',
lookup_field='pk',
)
class Meta:
model = Product
fields = [
'url',
'edit_url',
'name',
'description',
'price',
'sale_price',
]
def get_edit_url(self, obj):
# return f"/api/v2/products/{obj.pk}/"
request = self.context.get('request')
if request is None:
return None
return reverse("product-edit", kwargs={"pk": obj.pk}, request=request)
以防万一,这里是 products.url:
from django.urls import path
from . import views
urlpatterns = [
path('', views.ProductListCreateAPIView.as_view(), name='product-list'),
path('<int:pk>/update/', views.ProductUpdateAPIView.as_view(), name='product-edit'),
path('<int:pk>/delete/', views.ProductDestroyAPIView.as_view()),
path('<int:pk>/', views.ProductDetailAPIView.as_view(), name='product-details'),
]
以防万一,这是源 urls.py:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
path('api/products/', include('product.urls')),
path('api/v2/', include('rest_practice.routers')),
]
因此,当我以管理员身份登录 http://127.0.0.1:8000/admin/ 并前往 http://127.0.0.1:8000/api/products/ 时,我无法访问产品列表并接收
HTTP 401 Unauthorized
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Bearer
{
"detail": "Authentication credentials were not provided."
}
所以我不知道为什么身份验证不起作用,因此我们将不胜感激
编辑:我正在使用 Django 自己的管理面板
我认为这个问题有点不清楚,你是指 Django 自己的管理面板,还是你自己的一个调用该端点的管理面板。发生这种情况是因为从管理员转到该页面时,请求不包含您用户的令牌。
话虽这么说,我认为最好将 ListCreateAPIView 与管理页面解除关联(如果您谈论的是 Django 自己的管理页面),以便视图成为服务 API 调用的逻辑。为此,您只需将应用程序文件夹中的 admin.py 文件修改为如下所示:
from django.contrib import admin
from .models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_filter = ['some_column',...]
list_display = [...]
希望这有帮助。