基于Django类的观点,这是正确的方法吗?

时间:2015-10-13 16:24:17

标签: django

我正在使用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。

1 个答案:

答案 0 :(得分:1)

您实际上在DetailView基于类的视图中使用基于函数的视图(if语句是确定是返回一个对象还是所有对象的函数)。 DetailView是一个基于Django类的视图,用于显示一个对象的详细信息。你应该让这个观点只做一件事。

要显示对象列表,您应该使用ListView

一种解决方案是写一秒ListView并从您的urls.py中调用它,而不是为您的两个网址端点调用DetailView