Eine meiner Ansichten muss zusammen mit anderen Funktionen ein Element hinzufügen, aber ich habe bereits eine andere Ansicht, die speziell ein Element hinzufügt.
Kann ich so etwas machen wie:
def specific_add_item_view(request):
item = Item.objects.create(foo=request.bar)
def big_view(request):
# ...
specific_add_item_view(request)
django
django-views
john2x
quelle
quelle
Antworten:
Ansichtsfunktionen sollten einen gerenderten HTML-Code (in einem
HttpResponse
) an den Browser zurückgeben . Das Aufrufen einer Ansicht innerhalb einer Ansicht bedeutet, dass Sie das Rendern (möglicherweise) zweimal ausführen. Berücksichtigen Sie stattdessen einfach das "Hinzufügen" in einer anderen Funktion, die keine Ansicht ist, und lassen Sie es von beiden Ansichten aufrufen.def add_stuff(bar): item = Item.objects.create(foo=bar) return item def specific_add_item_view(request): item = add_stuff(bar) ... def big_view(request): item = add_stuff(bar) ...
quelle
Sicher, solange alles gesagt und getan ist, gibt Ihre Ansicht ein HttpResponse-Objekt zurück. Folgendes ist vollständig gültig:
def view1(request): # do some stuff here return HttpResponse("some html here") def view2(request): return view1(request)
Wenn Sie die HttpResponse nicht aus der ersten Ansicht zurückgeben möchten, speichern Sie sie einfach in einer Variablen, die Sie ignorieren möchten:
def view1(request): # do some stuff here return HttpResponse("some html here") def view2(request): response = view1(request) # do some stuff here return HttpResponse("some different html here")
quelle
view1
arbeitet wahrscheinlich an einem Objekt eines Modells oder etwas. Seth hat jedoch die richtige Idee. Es ist wahrscheinlich am besten , die gemeinsame Funktionalität aus beiden Ansichten zu nehmen und es in eine Funktion setzen , dassview1
undview2
Call- und dann kehren sie ihre jeweiligen Httpresponse - Objekte. Es ist nicht erforderlich, eine HttpResponse zu generieren, die nicht verwendet wird - insbesondere, wenn diese eine Vorlage enthält, die viele Abfragen erfordert.Ein besserer Weg ist die Verwendung des Vorlagensystems. Ideen von @Seth und @brady kombinieren:
def specific_add_item_view(request, extra_context_stuff=None): Item.objects.create() context_variables = {} # obviously want to populate this if extra_context_stuff: context_variables.update(extra_context_stuff) return render(request, 'app_name/view1_template.html', context_variables) def bigger_view(request): extra_context_stuff = {'big_view': True} return specific_add_item_view(request, extra_context_stuff)
Und Ihre app_name / view1_template.html enthält möglicherweise ein bedingtes Vorlagen-Tag
{% if big_view %} <p>Extra html for the bigger view</p> {% endif %}
quelle
render_to_response
zugunsten vonrender
.Ohne klassenbasierte Ansichten:
def my_view(request): return call_another_view(request) def call_another_view(request): return HttpResponse( ... )
Mit klassenbasierten Ansichten :
def my_view(request): return CallAnotherView.as_view()(request) class CallAnotherView(View): ...
quelle