2010-11-08 10 views
33

J'ai écrit une vue qui répond aux requêtes ajax du navigateur. Il est écrit comme si -Comment envoyer une réponse vide dans Django sans modèles

@login_required 
def no_response(request): 
    params = request.has_key("params") 
    if params: 
     # do processing 
     var = RequestContext(request, {vars}) 
     return render_to_response('some_template.html', var) 
    else: #some error 
     # I want to send an empty string so that the 
     # client-side javascript can display some error string. 
     return render_to_response("") #this throws an error without a template. 

Comment faire?

Voilà comment je gère la réponse du serveur sur côté client -

$.ajax 
    ({ 
     type  : "GET", 
     url  : url_sr, 
     dataType : "html", 
     cache : false, 
     success : function(response) 
     { 
      if(response) 
       $("#resp").html(response); 
      else 
       $("#resp").html("<div id='no'>No data</div>"); 
     } 
    }); 

Répondre

58

render_to_response est un raccourci spécifiquement pour le rendu d'un modèle. Si vous ne voulez pas faire cela, il suffit de retourner un vide HttpResponse:

from django.http import HttpResponse 
return HttpResponse('') 

Cependant, dans ce cas, je ne le ferais pas - vous signaler à l'AJAX qu'il y avait une erreur, vous devrait renvoyer une réponse d'erreur, éventuellement le code 400 - que vous pouvez faire en utilisant HttpResponseBadRequest à la place.

+0

oh cool! simple, donc mon problème s'est avéré être assez basique! de toute façon merci pour l'aide. appris quelque chose de nouveau aujourd'hui. –

9

Je pense que le meilleur code pour retourner une réponse vide est 204 No Content.

from django.http import HttpResponse 
return HttpResponse(status=204) 

Cependant, dans votre cas, vous ne devriez pas retourner une réponse vide, depuis 204 moyens: The server *successfully* processed the request and is not returning any content..

Il est préférable de retourner un code d'état 4xx pour mieux signaler que l'erreur est in the client side. Yo peut mettre une chaîne dans le corps de la réponse 4xx, mais je vous recommande fortement d'envoyer un JSONResponse:

from django.http import JsonResponse 
return JsonResponse({'error':'something bad'},status=400)