Django 和 Ajax 管理

Posted

技术标签:

【中文标题】Django 和 Ajax 管理【英文标题】:Django and Ajax management 【发布时间】:2013-12-21 03:11:48 【问题描述】:

我试图了解如何使用框架 Django 极大地管理 ajax 系统请求。 我想在我的应用程序中创建另一个views.py,以便只管理ajax请求。

我的第一个views.py

def my_playlists(request) :
   if not request.user.is_authenticated() :
       return HttpResponseRedirect('/login/')
    playlists = Playlist.objects.filter(user_id=request.user.id)
    return render(request, 'playlists/my_playlists.html', 'playlists' : playlists)

还有第二个views.py,我可以从jquery调用ajax请求。

@csrf_exempt
def getTemplateForm(request) :
   if request.is_ajax() :
      id_song = request.POST['id_song'];
      music = get_object_or_404(Music, pk=id_song)
      author = music.author
      title = music.title
      return render(request, 'playlists/edit-form-song.html', 'author' : author, 'title' : title)

我认为最好将 ajax 和 action 方法分开。 所以可以创建另一个视图吗?以及我如何处理 urls.py ?

【问题讨论】:

csrf for django+ajax - doc。使用@csrf_exempt 可能非常不安全。 【参考方案1】:

处理 AJAX 请求的视图没有什么特别的魔力。它们只有特定的标头作为响应。

例如,我将自定义装饰器用于 AJAX 视图。

# to set cookies in IE
import json as json2
from django.http import HttpResponse

def _setP3P( response ):
    response["P3P"] = 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"' # to set up cookies in AJAX views (for Internet Explorer)

def json( view ):
    def response( *args, **kwargs ):
        request, data = view( *args, **kwargs )

        response = HttpResponse(    json2.dumps( data ),
                                content_type = 'application/json' )

        _setP3P( response )

        return response

    return response

使用示例:

@json
def set_photo_mark( request ):
    req = request.REQUEST

    # actions here

    return request,  'result': "OK"  # json response

上面的视图生成json答案。

您可以通过标准方式将其包含到您的 urls.py 中:

urlpatterns = patterns('',          
    ( r'^set-photo-mark', 'phapp.views.set_photo_mark' ),
)

然后您可以对 /set-photo-mark/ 进行通常的 AJAX 调用。

对于非 ajax 视图,我有另一个装饰器:模板。

def template( template = None ):
    def template_inner( view ):
        def response( *args, **kwargs ):        

            args_list = list( args )

            request = args[ 0 ]
            del args_list[ 0 ]  

            request, result = view( request, *args_list, **kwargs )     

            req = request.REQUEST

            if type( result ) == dict:
                " Result is out. "
                t = loader.get_template( template )
                c = RequestContext( request, result )

                response = HttpResponse(    t.render(c),
                                        content_type = 'text/html' )            

            elif type( result ) == type( None ):
                response = HttpResponseNotFound( request )                                      
            else:
                response = redirect( result )

                _setP3P( response )

                return response

            return response

    return template_inner

这也很容易使用:

@template( "index.html" )
def index( request ):
    req = request.REQUEST

    user_id = req[ 'oid' ]

    # actions...

    if True:
        # an example of using the current template index.html
        return request,    'sid': user_id,
                    'user_id': req[ 'oid' ],
                    'PHOTOS_ROOT_URL': PHOTOS_ROOT_URL
                
    else:
        return request, '/help/' # an example of redirection to /help/

您可以制作包装模板来模拟视图继承。

【讨论】:

@Necko 可能不,你不应该。装饰器使用标准的方式来呈现模板、重定向等。

以上是关于Django 和 Ajax 管理的主要内容,如果未能解决你的问题,请参考以下文章

Django 管理员添加表单 ajax 调用

Django:管理员中的 AJAX/jQuery

Django模板层3和ajax初始

Django模板层3和ajax初始

Django之模型层应用和初识Ajax

Django之模型层应用和初识Ajax