2010-02-22 6 views
1

Le projet sur lequel je travaille contient des données qui doivent être transmises à chaque vue. Nous avons donc un wrapper autour de render_to_response appelé master_rtr. D'accord.Django: gestionnaire 404 personnalisé qui renvoie le code d'état 404

Maintenant, j'ai besoin de nos 404 pages pour les parcourir également. Pour the instructions, j'ai créé un gestionnaire personnalisé 404 (habilement appelé custom_404) qui appelle master_rtr. Tout a l'air bien, mais nos tests échouent, car nous recevons un 200 OK. Donc, j'essaie de comprendre comment renvoyer un code d'état 404 à la place. Il ya seems to be une classe HttpResponseNotFound qui est un peu ce que je veux, mais je ne suis pas tout à fait sûr comment construire tout ce non-sens au lieu d'utiliser render_to_response. Ou plutôt, je pourrais probablement le comprendre, mais il semble que leur doit être un moyen plus facile; y a-t-il?

Les parties appropriées du code:


def master_rtr(request, template, data = {}): 
    if request.user.is_authenticated(): 
    # Since we're only grabbing the enrollments to get at the courses, 
    # doing select_related() will save us from having to hit database for 
    # every course the user is enrolled in 
    data['courses'] = \ 
    [e.course for e in \ 
    Enrollment.objects.select_related().filter(user=request.user) \ 
    if e.view] 
    else: 
    if "anonCourses" in request.session: 
    data['courses'] = request.session['anonCourses'] 
    else: 
    data['courses'] = [] 

    data['THEME'] = settings.THEME 

    return render_to_response(template, data, context_instance=RequestContext(request)) 

def custom_404(request): 
    response = master_rtr(request, '404.html') 
    response.status_code = 404 
    return response 

Répondre

9

La manière simple:

def custom_404(request): 
    response = master_rtr(...) 
    response.status_code = 404 
    return response 

Mais je dois demander: pourquoi n'êtes-vous pas juste à l'aide d'un processeur de contexte avec un RequestContext à transmettre les données aux vues?

+0

Ah oui, c'est ce que je cherchais. Mise à jour de la question avec le code. –

+1

Eh bien, on dirait que vous pourriez simplement le faire dans un processeur de contexte (et ensuite l'ajouter au paramètre TEMPLATE_CONTEXT_PROCESSORS). Si vous craignez de perdre le raccourci plus simple qui utilise RequestContext, vous pouvez simplement utiliser django.views.generic.simple.direct_to_template – SmileyChris

0

dans votre application views.py add de:

# Imports 
from django.shortcuts import render 
from django.http import HttpResponse 
from django.template import Context, loader 


## 
# Handle 404 Errors 
# @param request WSGIRequest list with all HTTP Request 
def error404(request): 

    # 1. Load models for this view 
    #from idgsupply.models import My404Method 

    # 2. Generate Content for this view 
    template = loader.get_template('404.htm') 
    context = Context({ 
     'message': 'All: %s' % request, 
     }) 

    # 3. Return Template for this view + Data 
    return HttpResponse(content=template.render(context), content_type='text/html; charset=utf-8', status=404) 

Le secret est dans la dernière ligne: status = 404

espère que cela a aidé!

Questions connexes