2009-08-22 6 views
3

Ich versuche, einen django Aufnahme-Tag zu schreiben, die eine beliebige Anzahl von Argumenten entgegennimmt:Beliebige Anzahl von Positionsargumenten im Django-Inclusion-Tag?

@register.inclusion_tag('so.html') 
def table_field(*args): 
fields = [] 
for arg in args: 
    fields.append(arg) 
return { 'fields': fields, } 

Allerdings, wenn ich dies von Djangos Template-Engine nennen:

{% table_field form.hr form.bp form.o2_sat %} 

ich den Fehler:

table_field takes 0 arguments 

Ist dies noch eine weitere Einschränkung der Template Engine von django?

Antwort

0

Dies ist eine weitere Einschränkung von Djangos Einschluss-Tags. Momentan ist dies in der Django-Stammversion nicht möglich.

+0

Irgendeine Idee, wenn es Fortschritte dabei gibt? – Oli

1

Sie müssen Ihr eigenes Template-Tag schreiben, denke ich.

2

Re: Ich versuche, einen django Aufnahme-Tag zu schreiben, die eine beliebige Anzahl von Argumenten

Ich denke, nehmen sollten Sie die beliebige Anzahl von Argumenten in der Ansicht als ein einziges Argument übergeben, als eine Art Sammlung.

Basierend auf dem documentation, ich glaube, Sie aus der Sicht auf die Vorlage der Aufnahme Tag einige Sammlung Objekt übergeben sollte, und die Aufnahme-Tag schreiben als:

@register.inclusion_tag('so.html') 
def table_field(args): 
    return { 'fields': [arg for arg in args], } 

dann Ihre Vorlage wie folgt aussieht:

Ich glaube nicht, dass Vorlagen zu Präsentationsentscheidungen bezüglich der Auswahl von Daten führen sollen und dass diese Entscheidung am besten in der Ansicht gehandhabt wird.

+2

Meine Frage fragt nach der Übergabe einer beliebigen Anzahl von Argumenten an ein Inclusion-Tag, aber Sie veröffentlichen ein Inclusion-Tag, das nur ein Argument verwendet. Wo ist die Logik? Ich erinnere mich nicht, dass ich nach Design gefragt habe. Ich habe bereits entschieden, dass die Vorlage der richtige Ort für diese Präsentationslogik ist ... – slypete

+0

Manchmal ist "Do not do" die richtige Antwort. – hughdbrown

+0

Ich verstehe. Aber nicht in diesem Fall. – slypete

3

Ab 1.2.1 können Sie Argumente an Einschluss-Tags übergeben.

Hier ist ein Beispiel aus meiner mods Abstimmung templatetags

@register.inclusion_tag("voting/vote_form.html", takes_context=True) 
def vote_form(context, vote_object, vote_dict, score_dict): 
    if isinstance(vote_dict, dict): 

und die Vorlage sieht django wie:

{% vote_form bookmark vote_dict score_dict %} 

Was Ich mag über das nicht ist es zu nennen keine Möglichkeit gibt, die Argumente, nur um sie in Ordnung zu bringen, aber es funktioniert.

Was mir im Moment nicht so klar ist, ist warum, wenn Sie takes_context angeben, wird dieser übergeordnete Kontext nicht zusammen mit dem Kontext übergeben, den Sie zum Rendern der Einschlussvorlage zurückgeben.

Ihr Versuch, * Args zu verwenden, funktioniert jedoch nicht, weil die Anzahl der übergebenen Argumente gegen die Funktion geprüft wird.

+0

Hallo Markus, das ist nicht neu in 1.2.1. Ich mache es schon eine Weile. Meine Frage war über willkürliche Positionsargumente. Deine Antwort enthält einen Satz zu diesem Thema und ahmt meine Antwort vom letzten Jahr nach. – slypete

+0

Es tut mir leid, ich sehe meinen einen Satz nirgendwo auf der Seite. Die Überprüfung, die auf dieser Ebene des Codes durchgeführt wird, macht es unmöglich zu tun, was Sie fragen. Es gibt eine explizite Überprüfung auf die Anzahl von Argumenten, die an ein Einschluss-Tag übergeben werden, da diese Überprüfung nicht erkennen kann, was Sie mit einem * Argument tun, es ist unmöglich mit Einschluss-Tags zu tun. Wenn diese Kontrolle nicht vorhanden wäre oder abgeschaltet werden könnte, wäre es gut zu gehen. Ich habe gerade in diesem Bereich debuggt, ist der einzige Grund, dass ich wusste, dass es unmöglich war. – boatcoder

+0

Die Frage ist, wie man mit einer beliebigen Anzahl von Argumenten umgeht. Diese Antwort sagt nur, wie man mit einer endlichen Zahl umgeht. – Apreche

Verwandte Themen