Django — wie zu verwenden templatetags filter mit mehreren Argumenten
Habe ich ein paar Werte, die ich gerne weitergeben möchte in einen filter und erhalten eine URL aus ihm heraus.
In meinem template habe ich:
{% if names %}
{% for name in names %}
<a href='{{name|slugify|add_args:"custid=name.id, sortid=2"}}'>{{name}}</a>
{%if not forloop.last %} | {% endif %}
{% endfor %}
{% endif %}
In meinem templatetags ich habe:
@register.filter
def add_args(value, args):
argz = value.strip() + '-' + 'ARGS'
arglist = args.split(',')
for arg in arglist:
keyval = arg.split('=')
argz.join(keyval[0] + 'ZZ' + keyval[1])
argz.join('QQ')
return argz
Die Ausgabe-URL sollte wie folgt Aussehen:
http://foo.org/john-smith-ARGScustidZZ11QQsortidZZ2
Wo ARGS ist der start der Argumente, ZZ '=' und QQ ist ein '&' entspricht.
Erstens: Das würde funktionieren, aber ich bekomme die custid=name.id kommt in die add_args(), wo ich ihn haben will custid=11 zu kommen. Wie übergeben Sie die id als id und nicht den text.
Auch, gibt es eine Möglichkeit, senden Sie uns einfach ein array mit key=>Wert wie in PHP.
In PHP würde ich bauen ein array, sagen wir:
arglist = array('custid' => $nameid, 'sortid' => $sortid );
Dann würde ich mich übergeben der Argumente als argument für add_args()
und in add_args()
ich tun würde,
foreach( arglist as $key => $value)
$argstr .= $key . 'ZZ' . $value . 'QQ'.
Kennt jemand einen besseren Weg, von dieser Arbeit?
Hinweis: wenn ich alle übergeben Argumente als string aus und teilen Sie Sie in den filter, die ich nicht Verstand. Ich weiß nur nicht, wie das übergeben des namens.id als Wert ...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese "smart" Sachen Logik sollte nicht in der Vorlage.
Bauen Sie Ihre end-of-urls in Ihren anzeigen, und geben Sie dann in Vorlage:
In template.html:
Wenn Sie eine url für eine ganze Reihe von Objekten, die erwägen, get_absolute_url auf das Modell.
get_absolute_url
. Hier ist eine gute blog post über diepermalink
decorator zu verwenden, und wie es sein kann, sehr cool.Du kannst nicht vorbei
name.id
zu Ihrem filter. Filter-Argumente können asingle Wert oder ein einzelnes literal. Python/Django nicht versuchen, eine "intelligente" variable Ersatz wie PHP.Ich schlage vor, Sie erstellen Sie ein tag für diese Aufgabe:
Diese Weise können Sie wissen, dass das argument ein literal, Wert und welche sollten ergriffen werden, fron Kontext etc... Docs sind ganz klar über diese, nehmen Sie einen Blick auf die Beispiel.
Auch wenn diese
name
irgendeine Weise im Zusammenhang mit einem Modell, sagen, wir wollen um den permalink, das hinzufügen einer Methode liefert die URL mit den richtigen Argumenten könnte die gepflegten Orten Lösung.Insgesamt würde ich verzichten, zu viel Logik in die templates. Django ist nicht PHP.
translate
? Es ist schon django-template.Die Sie aufrufen
argz.join
ein paar mal und nie die Zuordnung der Ergebnisse zu irgendetwas: vielleicht bist du das unter dem Missverständnis, dass diejoin
- Methode der string hat eine mysteriöse Nebenwirkung, aber es funktioniert nicht-es ist nur gibt eine neue Zeichenfolge, und wenn Sie gar nichts mit, die neue Zeichenkette Puh, es ist Weg. Ist, dass zumindest ein Teil des Problems...?