2016-04-06 9 views
1

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?

+1

Sie könnten eine Context-Variable, auch "URL" genannt, in Ihrer 'people'-Ansicht übergeben. – Selcuk

+0

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

Antwort

1

Selcuk had the right idea. Ich benutzte Jinja Vorlagen, und die kwargs werden automatisch hinzugefügt. Einer meiner war <url> und war über die url Erweiterung, die ich in der Jinja-Umgebung hinzugefügt hatte. Das Umbenennen des kwarg zu etwas anderem löste das Problem.

Verwandte Themen