2012-03-06 89 views
0

我在许多应用程序的许多视图中具有以下功能。如下所示:将重复查看功能包含到多个视图中?

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

我该如何在我的所有应用程序的views.py中包含此信息?定义它在一个单一的应用程序,并从它进口?

from main.global import simplejson 

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

+0

可能的重复[如何在Django应用中包含自定义模块](http://stackoverflow.com/questions/2576060/how-can-i-include-custom-modules-in-a-django-app ) – 2012-03-06 05:42:48

回答

0

是的,你可以只需在单个视图或utils文件中定义它,或者任何你想要的,只需将它导入到所有视图中即可。我经常用无处不在的功能来做这件事。

1

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

事实上,这是在documentation for class based views的例子类型之一:

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)