我正在使用django和django-braces。如果这是正确的方法,那就是征求意见。
对于此示例,我只是尝试使用CBV以json格式返回用户和特定用户。
浏览
class ListAllUsers(JSONResponseMixin, DetailView):
model = User
json_dumps_kwargs = {u"indent": 2}
def get(self, request, *args, **kwargs):
object = self.get_object()
context_dict = collections.defaultdict(list)
if not self.kwargs.get("pk"):
for obj in object:
context_dict[obj.id].append ({
u"name": obj.username,
u"email": obj.email
})
else:
context_dict[object.id].append ({
u"name": object.username,
u"email": object.email
})
return self.render_json_response(context_dict)
def get_object(self):
if not self.kwargs.get("pk"):
return User.objects.all()
else:
return get_object_or_404(User, pk=self.kwargs.get("pk"))
网址
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^users/$', ListAllUsers.as_view(), name="users-list"),
url(r'^users/(?P<pk>[0-9]+)/$', ListAllUsers.as_view(), name="users-detail")
]
我知道这是一个主观问题,但我希望您的意见能够得到支持,因为我很难确定如何最佳地使用CBV。
答案 0 :(得分:1)
您实际上在DetailView
基于类的视图中使用基于函数的视图(if
语句是确定是返回一个对象还是所有对象的函数)。 DetailView
是一个基于Django类的视图,用于显示一个对象的详细信息。你应该让这个观点只做一件事。
要显示对象列表,您应该使用ListView
。
一种解决方案是写一秒ListView
并从您的urls.py中调用它,而不是为您的两个网址端点调用DetailView
。