Ich habe eine base.html
in my_project/jinja2/
und es enthält alles außer <body>
für eine Website. Wir erweitern dann base.html
wie man tut.URL-Funktion in jinja2 Vorlage wirft AttributError in Django
In diesem Beispiel habe ich base.html
von App people
in einer Datei auf my_project/people/jinja2/people/people_list.html
mit so etwas wie dies am erstreckt:
{% extends "base.html" %}
{% block content %}
<!-- Some html -->
{% endblock content %}
Mein base.html
enthält einen Link zu dem Blog RSS-Feed in den <head>
etwa so:
<link rel="alternate" type="application/atom+xml" title="Blog" href="{{ url('blog:articles_feed') }}" />
Dies funktioniert in den meisten Orten wie my_project/jinja2/index.html
und my_project/jinja2/blog_list.html
aber in dieser 3. App people
, bekomme ich die fol bei dieser Politik der Template-Code lowing Fehler:
AttributeError: 'str' object has no attribute '__call__'
Da jinja2 besser Debuggen habe ich Python in werkzueg laufen kann und einige mögliche Details sehen, was passiert sein könnte:
locals()
die Ausgänge:
{
'_': {...},
'static': < bound method StaticFilesStorage.url of < django.contrib.staticfiles.storage.StaticFilesStorage object at 0x7f423ec3ebe0 >> ,
'joiner': < class 'jinja2.utils.Joiner' > ,
'request': < WSGIRequest: GET '/case-studies/hog?__debugger__=yes&cmd=locals()&frm=139922493301984&s=XfAagGnpxRWFBRRd0Uzk' > ,
'page': None,
'csrf_input': < django.utils.functional.lazy. <locals> .__proxy__ object at 0x7f423e8262e8 > ,
'cycler': < class 'jinja2.utils.Cycler' > ,
'dict': < class 'dict' > ,
'absolute_url': < function absolute_url at 0x7f423ece5b70 > ,
'lipsum': < function generate_lorem_ipsum at 0x7f423ebfc8c8 > ,
'view': < leaf.views.LeafTemplateView object at 0x7f423e820198 > ,
'range': < class 'range' > ,
'ngettext': < function ungettext at 0x7f42450547b8 > ,
'gettext': < function ugettext at 0x7f4245054730 > ,
'absolute_root': < function absolute_root at 0x7f423ece8268 > ,
'datetime': < class 'datetime.datetime' > ,
'csrf_token': < django.utils.functional.lazy. <locals> .__proxy__ object at 0x7f423e826400 > ,
'url': 'people/all'
}
ich bin nicht sicher, ob dies eine richtige Annahme ist, sondern url
nicht korrekt als Funktion in die Umgebung hinzugefügt wird, sondern ein String statt? Es ist in meiner jinja2.py-Datei und funktioniert anders als erwartet in jinja2-Vorlagen. Was gibt?
Sie könnten eine Context-Variable, auch "URL" genannt, in Ihrer 'people'-Ansicht übergeben. – Selcuk
Interessanter Punkt. Ich hatte so etwas nicht in Betracht gezogen. Ich habe das in der 'people' App mit einem URL-Pfad eingerichtet:' url (r '^ people-list /', TemplateView.as_view (template_name = "people_list.html")), '. Von [Django-Quelle für TemplateView] (https://github.com/django/django/blob/1.8/django/views/generic/base.py#L152) sehe ich 'TemplateView' keine 'URL' Kontextvariable. Wenn jinja verwendet wird, würde irgendetwas anderes nur für diese Ansicht einen Kontext unerwartet hinzufügen (in einigen anderen Ansichten funktioniert es gut). – Chris