将重复视图功能包含在多个视图中



我在许多应用程序的许多视图中都有以下功能。如下所示:

def json_response(data):
    return HttpResponse(
        simplejson.dumps(data),
        content_type = 'application/json; charset=utf8'
    )

我该如何将其包含在我所有应用程序的视图.py中?在单个应用程序中定义它,然后从中导入?

from main.global import simplejson

此外,我是否可以查看一个组织良好的django项目的github页面?

如果您使用的是django 1.3,则可以使用基于类的视图来抽象此函数。您只需从一个基本视图扩展视图,该视图将返回传入的任何内容的json。您将在某个公共位置保存一个带有此类的文件(如Ignacio在评论中链接的答案所述)。

事实上,这是文档中基于类的视图的示例类型之一:

from django import http
from django.utils import simplejson as json
class JSONResponseMixin(object):
    def render_to_response(self, context):
        "Returns a JSON response containing 'context' as payload"
        return self.get_json_response(self.convert_context_to_json(context))
    def get_json_response(self, content, **httpresponse_kwargs):
        "Construct an `HttpResponse` object."
        return http.HttpResponse(content,
                                 content_type='application/json',
                                 **httpresponse_kwargs)
    def convert_context_to_json(self, context):
        "Convert the context dictionary into a JSON object"
        # Note: This is *EXTREMELY* naive; in reality, you'll need
        # to do much more complex handling to ensure that arbitrary
        # objects -- such as Django model instances or querysets
        # -- can be serialized as JSON.
        return json.dumps(context)

这就是你将如何使用它(也来自文档):

class HybridDetailView(JSONResponseMixin,
                       SingleObjectTemplateResponseMixin, BaseDetailView):
    def render_to_response(self, context):
        # Look for a 'format=json' GET argument
        if self.request.GET.get('format','html') == 'json':
            return JSONResponseMixin.render_to_response(self, context)
        else:
            return SingleObjectTemplateResponseMixin.render_to_response(self, context)

是的,您可以在单个视图、utils文件或任何您想要的文件中定义它,然后在所有视图中导入它。我经常用无处不在的函数来做这件事。

最新更新