55 Stimmen

Django-Vorlage und der Trick mit den Locals

In den django-Büchern wird ein lokaler Trick beschrieben, um zu vermeiden, dass eine lange Liste von Parametern als Kontext-Wörterbuch eingegeben werden muss

http://www.djangobook.com/en/2.0/chapter04/

Ejemplo:

def current_datetime(request):
    dt_now = datetime.datetime.now()
    return render_to_response('current.html', {'dt_now': dt_now})

wird:

def current_datetime(request):
    dt_now = datetime.datetime.now()
    return render_to_response('current.html', locals())

Er empfiehlt dies für faule Programmierer, weist aber auf einen gewissen Overhead hin, der sich auf die Leistung auswirken kann.

Ich würde gerne wissen, ob einige von Ihnen den Trick mit den Einheimischen bei echten Anwendungen anwenden. Empfehlen Sie ihn oder ist er eine schlechte Praxis?

1voto

max Punkte 8677

Ich weiß, dies ist ein altes Thema... derzeit render_to_response ist veraltet. Verwenden Sie stattdessen render ohne locals(). Die Weitergabe aller locals ist eine schlechte Praxis. Hier ist ein views.py Beispiel:

from django.shortcuts import render
from django.contrib.auth.decorators import login_required

@login_required
def mybooks(request):
    entries = Book.objects.all()
    return render(request, 'mybooks.html', {'entries': entries})

0 Stimmen

Render_to_response ist noch nicht veraltet. Es wird in 2.0 veraltet sein, aber nicht jetzt.

1voto

Raffi Punkte 902

Um die Unordnung in views.py wobei die Dinge eindeutig bleiben: In controllers.py :

import sys

def auto_context(the_locals=None):
    # Take any variable in the locals() whose name ends with an underscore, and
    # put it in a dictionary with the underscore removed.

    if the_locals is None:
        # We can access the locals of the caller function even if they
        # aren't passed in.
        caller = sys._getframe(1)
        the_locals = caller.f_locals

    return dict([
        (key[:-1], value)
        for (key, value) in the_locals.items()
        if key[-1] == "_"])

Sur views.py :

from app.controllers import auto_context

def a_view(request): 
    hello_ = "World" # This will go into the context.
    goodnight = "Moon" # This won't.
    return render(request, "template.html", auto_context())

Sur template.html verwenden {{ hello }} .

Es ist unwahrscheinlich, dass Sie einer Variablen versehentlich einen Namen geben, der mit einem Unterstrich endet. So wissen Sie genau, was in die Vorlage aufgenommen wird. Verwenden Sie auto_context() oder gleichwertig auto_context(locals()) . Viel Spaß!

-1voto

Ich stimme mit Alex überein. Sehen Sie nicht den Sinn der Erstellung einer Klasse Instanz (wie Niels vorgeschlagen), wenn Sie gerade dies tun können:

def my_view(request, id):
    customer = ..
    invoice = ..
    date = ..
    return render_to_response('xxx,html', locals())

Wenn Sie einen Grund für die Leistung suchen, sind punktierte Suchvorgänge langsamer.

Wenn Sie einen Grund für die Wartung suchen, ist dies weniger Codezeilen, sogar más lesbar, und eine unnötige Struktur weniger.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X