Opened 16 years ago

Closed 16 years ago

Last modified 13 years ago

#8725 closed (fixed)

TemplateSyntaxError at /admin/ with [8760]

Reported by: Karen Tracey Owned by: Malcolm Tredinnick
Component: Core (Other) Version: 1.0
Severity: Keywords:
Cc: ville@…, carl@… Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

I get TemplateSyntaxError at /admin/ after updating to current this AM, isolated to being introduced in [8760]; backing up to [8759] makes it go away. Full cut-and-paste info:

Environment:

Request Method: GET
Request URL: http://lbox:8000/admin/
Django Version: 1.0-beta_2-SVN-8760
Python Version: 2.5.1
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'django.contrib.sites',
 'django.contrib.humanize',
 'xword.crossword']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.middleware.doc.XViewMiddleware')


Template error:
In template /home/kmt/tmp/django/trunk/django/contrib/admin/templates/admin/base.html, error at line 25
   Caught an exception while rendering: 
   15 : <!-- Container -->
   16 : <div id="container">
   17 : 
   18 :     {% if not is_popup %}
   19 :     <!-- Header -->
   20 :     <div id="header">
   21 :         <div id="branding">
   22 :         {% block branding %}{% endblock %}
   23 :         </div>
   24 :         {% if user.is_authenticated and user.is_staff %}
   25 :         <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}</strong>. {% block userlinks %} {% url django-admindocs-docroot as docsroot %} {% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}<a href="{{ root_path }}password_change/">{% trans 'Change password' %}</a> / <a href="{{ root_path }}logout/">{% trans 'Log out' %}</a>{% endblock %}</div>
   26 :         {% endif %}
   27 :         {% block nav-global %}{% endblock %}
   28 :     </div>
   29 :     <!-- END Header -->
   30 :     {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} &rsaquo; {{ title|escape }}{% endif %}</div>{% endblock %}
   31 :     {% endif %}
   32 : 
   33 :         {% if messages %}
   34 :         <ul class="messagelist">{% for message in messages %}<li>{{ message|escape }}</li>{% endfor %}</ul>
   35 :         {% endif %}

Traceback:
File "/home/kmt/tmp/django/trunk/django/core/handlers/base.py" in get_response
  86.                 response = callback(request, *callback_args, **callback_kwargs)
File "/home/kmt/tmp/django/trunk/django/contrib/admin/sites.py" in root
  160.             return self.index(request)
File "/home/kmt/tmp/django/trunk/django/views/decorators/cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)
File "/home/kmt/tmp/django/trunk/django/contrib/admin/sites.py" in index
  342.             context_instance=template.RequestContext(request)
File "/home/kmt/tmp/django/trunk/django/shortcuts/__init__.py" in render_to_response
  18.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/home/kmt/tmp/django/trunk/django/template/loader.py" in render_to_string
  107.     return t.render(context_instance)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/home/kmt/tmp/django/trunk/django/template/loader_tags.py" in render
  97.         return compiled_parent.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/home/kmt/tmp/django/trunk/django/template/loader_tags.py" in render
  97.         return compiled_parent.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/home/kmt/tmp/django/trunk/django/template/defaulttags.py" in render
  245.                     return self.nodelist_true.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/home/kmt/tmp/django/trunk/django/template/defaulttags.py" in render
  255.             return self.nodelist_true.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/home/kmt/tmp/django/trunk/django/template/loader_tags.py" in render
  24.         result = self.nodelist.render(context)
File "/home/kmt/tmp/django/trunk/django/template/__init__.py" in render
  756.                 bits.append(self.render_node(node, context))
File "/home/kmt/tmp/django/trunk/django/template/debug.py" in render_node
  81.             raise wrapped

Exception Type: TemplateSyntaxError at /admin/
Exception Value: Caught an exception while rendering: 

Original Traceback (most recent call last):
  File "/home/kmt/tmp/django/trunk/django/template/debug.py", line 71, in render_node
    result = node.render(context)
  File "/home/kmt/tmp/django/trunk/django/template/defaulttags.py", line 373, in render
    url = reverse(self.view_name, args=args, kwargs=kwargs)
  File "/home/kmt/tmp/django/trunk/django/core/urlresolvers.py", line 250, in reverse
    *args, **kwargs)))
  File "/home/kmt/tmp/django/trunk/django/core/urlresolvers.py", line 226, in reverse
    possibilities, pattern = self.reverse_dict.get(lookup_view, [(), ()])
  File "/home/kmt/tmp/django/trunk/django/core/urlresolvers.py", line 159, in _get_reverse_dict
    parent = normalize(pattern.regex.pattern)
  File "/home/kmt/tmp/django/trunk/django/utils/regex_helper.py", line 77, in normalize
    ch, escaped = pattern_iter.next()
StopIteration

There's nothing particularly fancy about my admin setup (no over-ridden templates or anything, so far as I recall). My own views work fine, so far as I've checked. If this is not generally recreatable let me know what info would be most helpful to track it down.

Attachments (2)

regex_helper_r8761.diff (584 bytes ) - added by oggy 16 years ago.
regex_helper_r8761_with_test.diff (1.2 KB ) - added by Carl Meyer 16 years ago.
added regression test to patch

Download all attachments as: .zip

Change History (18)

comment:1 by Karen Tracey, 16 years ago

Just a note, since you can't see the debug page highlighting in the ticket, it the {% url django-admindocs-docroot as docsroot %} on line 25 that is highlighted. I do have admindocs in my INSTALLED_APPS and documentation was working as of yesterday. Removing it from INSTALLED_APPS and its urlpattern ((r'^admin/doc/', include('django.contrib.admindocs.urls')),) from urls.py, though, doesn't appear to change anything, I still get the error on any attempt to access an admin page.

comment:2 by Jacob, 16 years ago

Component: UncategorizedAdmin interface
Triage Stage: UnreviewedAccepted

comment:3 by oggy, 16 years ago

Component: Admin interfaceCore framework

I upgraded to r8760 today and all hell broke loose with reversing my own views. Fixing one line in regex_helper seems to do the trick, and should hopefully fix this one too.

by oggy, 16 years ago

Attachment: regex_helper_r8761.diff added

comment:4 by Ville Säävuori, 16 years ago

Cc: ville@… added

#8726 might be related to this, although the exception is different.

comment:5 by Carl Meyer, 16 years ago

Cc: carl@… added

comment:6 by Carl Meyer, 16 years ago

I can reproduce this problem (in my own views/templates), and the attached patch fixes it for me.

comment:7 by Carl Meyer, 16 years ago

I've tracked this problem down to the use of an empty regex in a URLConf. This is useful in order to include an application's urls with no prefix; i.e. something like this at the end of a urlpatterns:

url(r'', include('some_app.urls'))

Based on this, I think the attached patch is the correct fix. The first call to next() will raise StopIteration if the pattern is zero-length, so it needs to be within the try block.

comment:8 by Malcolm Tredinnick, 16 years ago

Owner: changed from nobody to Malcolm Tredinnick
Status: newassigned

by Carl Meyer, 16 years ago

added regression test to patch

comment:9 by Alex Gaynor, 16 years ago

Resolution: fixed
Status: assignedclosed

Fixed in r8763.

comment:10 by FlorentV, 16 years ago

Hello,

I get the exact same Template Error with 1.0 RC1. Is that normal (fix not in RC1)?

Since it blocked any use of the admin, I hacked the admin/base.html template, removing the whole link to the documentation.

comment:11 by Jacob, 16 years ago

FlorentV: can you please post your whole error? Make sure to use the "show copy/paste error" button, and paste the error between {{{ and }}} (three braces) so that Trac displays it OK.

comment:12 by FlorentV, 16 years ago

jacob: my bad, it was just a problem with a bad urlconf. I had a reference to a view that didn't “exist” since it was in an app I had commented out in INSTALLED_APPS. So basically it was the same problem as in this ticket: http://code.djangoproject.com/ticket/8854

Of course it's not a bug, just a mistake on my part. But it's too bad the error I got was a not-so-helpful template error. If a reference to a non-existing view in urlconf breaks some important feature of the framework, maybe Django should catch this error earlier on and display a specific error?

comment:13 by atilev@…, 16 years ago

Has patch: set
Resolution: fixed
Status: closedreopened
Version: SVN1.0

Hi,
I get this same error. It appears very sporadic. When I'm in the admin page if I hit refresh it comes up. My stack trace is identical to the previuse users.

I looked in my regex_helper.py and it already seems to have the fix in place

try:

ch, escaped = pattern_iter.next()

except StopIteration:

return zip([], [[]])

I do have a

(r'$', '/index.html'),

in my urls.py

other than that nothing fancy.

comment:14 by Gary Wilson, 16 years ago

Resolution: fixed
Status: reopenedclosed

Perhaps you have not defined a view that is referenced in your URLconf. Please take your issue to the django-users list.

comment:15 by anibal, 15 years ago

I got this problem today with django-svn. I found that the error only appear when my database is empty, after insert some users and the fixture of my main app the error goes away. Weird.

comment:16 by Jacob, 13 years ago

milestone: 1.0

Milestone 1.0 deleted

Note: See TracTickets for help on using tickets.
Back to Top