Вакансия редактируется, но при сохранении вылетает следующие
NoReverseMatch at /ru-ru/admin/careers/jobpost/
Reverse for 'jobpost_detail' with arguments '()' and keyword arguments '{'slug': u'\u043f\u0442\u0440\u0432\u0440\u0438'}' not found. 0 pattern(s) tried: []
Environment:
Request Method: GET
Request URL: http://sdelka.global-changes.ru/ru-ru/admin/careers/jobpost/
Django Version: 1.7
Python Version: 2.7.8
Installed Applications:
('mezzanine.boot',
'sdelka.moderna',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.redirects',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.sitemaps',
'mezzanine.conf',
'mezzanine.core',
'mezzanine.generic',
'mezzanine.blog',
'mezzanine.forms',
'mezzanine.pages',
'mezzanine.galleries',
'mezzanine.twitter',
'careers',
'filebrowser_safe',
'grappelli_safe',
'django.contrib.admin',
'django.contrib.staticfiles',
u'django.contrib.comments')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'mezzanine.core.request.CurrentRequestMiddleware',
'mezzanine.core.middleware.RedirectFallbackMiddleware',
'mezzanine.core.middleware.TemplateForDeviceMiddleware',
'mezzanine.core.middleware.TemplateForHostMiddleware',
'mezzanine.core.middleware.AdminLoginInterfaceSelectorMiddleware',
'mezzanine.core.middleware.SitePermissionMiddleware',
'mezzanine.pages.middleware.PageMiddleware')
Template error:
In template /home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/grappelli_safe/templates/admin/change_list.html, error at line 105
Reverse for 'jobpost_detail' with arguments '()' and keyword arguments '{'slug': u'\u043f\u0442\u0440\u0432\u0440\u0438'}' not found. 0 pattern(s) tried: []
95 :
96 : <!-- Management Form -->
97 : {% if cl.formset %}
98 : {{ cl.formset.management_form }}
99 : {% endif %}
100 :
101 : <!-- Results -->
102 : <div class="result-list-container">
103 : {% block result_list %}
104 : {% if action_form and actions_on_top and cl.full_result_count and cl.result_count %}{% admin_actions %}{% endif %}
105 : {% result_list cl %}
106 : {% if action_form and actions_on_bottom and cl.full_result_count and cl.result_count %}{% admin_actions %}{% endif %}
107 : {% endblock %}
108 : {% block pagination %}{% pagination cl %}{% endblock %}
109 : </div>
110 :
111 : <!-- Submit-Row -->
112 : {% if cl.formset and cl.result_count %}
113 : <p class="submit-row">
114 : <input type="submit" name="_save" class="default" value="{% trans 'Save' %}"/>
115 : </p>
Traceback:
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
137. response = response.render()
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/response.py" in render
103. self.content = self.rendered_content
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/response.py" in rendered_content
80. content = template.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
148. return self._render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/loader_tags.py" in render
126. return compiled_parent._render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in _render
142. return self.nodelist.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/loader_tags.py" in render
65. result = block.nodelist.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
844. bit = self.render_node(node, context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/debug.py" in render_node
80. return node.render(context)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/template/base.py" in render
1207. _dict = func(*resolved_args, **resolved_kwargs)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in result_list
316. 'results': list(results(cl))}
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in results
289. yield ResultList(form, items_for_result(cl, res, form))
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in __init__
283. super(ResultList, self).__init__(*items)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/contrib/admin/templatetags/admin_list.py" in items_for_result
198. f, attr, value = lookup_field(field_name, result, cl.model_admin)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/contrib/admin/utils.py" in lookup_field
280. value = attr()
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/mezzanine/core/models.py" in admin_link
105. return "<a href='%s'>%s</a>" % (self.get_absolute_url(),
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/utils/functional.py" in _curried
17. return _curried_func(*(args + moreargs), **dict(kwargs, **morekwargs))
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/db/models/base.py" in get_absolute_url
1451. return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.model_name), func)(self, *args, **kwargs)
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/db/models/__init__.py" in inner
40. return reverse(bits[0], None, *bits[1:3])
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/core/urlresolvers.py" in reverse
546. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
File "/home/users/a/a-palanski/virtualenv/test6/lib/python2.7/site-packages/django/core/urlresolvers.py" in _reverse_with_prefix
463. (lookup_view_s, args, kwargs, len(patterns), patterns))
Exception Type: NoReverseMatch at /ru-ru/admin/careers/jobpost/
Exception Value: Reverse for 'jobpost_detail' with arguments '()' and keyword arguments '{'slug': u'\u043f\u0442\u0440\u0432\u0440\u0438'}' not found. 0 pattern(s) tried: []
views
from calendar import month_name
from django.shortcuts import get_object_or_404
from collections import defaultdict
from django.contrib.contenttypes.models import ContentType
from django import VERSION
from careers.models import JobPost
from mezzanine.conf import settings
from mezzanine.generic.models import AssignedKeyword, Keyword
from mezzanine.utils.views import render, paginate
def jobpost_list(request, tag=None, year=None, month=None, template="careers/jobpost_list.html"):
"""
Display a list of job posts that are filtered by year, month.
"""
settings.use_editable()
templates = []
jobposts = JobPost.objects.published()
if tag is not None:
tag = get_object_or_404(Keyword, slug=tag)
jobposts = jobposts.filter(keywords__in=tag.assignments.all())
if year is not None:
jobposts = jobposts.filter(publish_date__year=year)
if month is not None:
jobposts = jobposts.filter(publish_date__month=month)
month = month_name[int(month)]
# We want to iterate keywords and categories for each blog post
# without triggering "num posts x 2" queries.
#
# For Django 1.3 we create dicts mapping blog post IDs to lists of
# categories and keywords, and assign these to attributes on each
# blog post. The Blog model then uses accessor methods to retrieve
# these attributes when assigned, which will fall back to the real
# related managers for Django 1.4 and higher, which will already
# have their data retrieved via prefetch_related.
jobposts = jobposts.select_related("user")
if VERSION >= (1, 4):
jobposts = jobposts.prefetch_related("keywords__keyword")
else:
if jobposts:
ids = ",".join([str(p.id) for p in jobposts])
keywords = defaultdict(list)
jobpost_type = ContentType.objects.get(app_label="careers", model="jobpost")
assigned = AssignedKeyword.objects.filter(jobpost__in=jobposts, content_type=jobpost_type).select_related("keyword")
for a in assigned:
keywords[a.object_pk].append(a.keyword)
for i, post in enumerate(jobposts):
setattr(jobposts[i], "_keywords", keywords[post.id])
jobposts = paginate(jobposts, request.GET.get("page", 1),
settings.CAREERS_PER_PAGE,
settings.MAX_PAGING_LINKS)
context = {"jobposts": jobposts, "year": year, "month": month, "tag": tag}
templates.append(template)
return render(request, templates, context)
def jobpost_detail(request, template="careers/jobpost_detail.html"):
""". Custom templates are checked for using the name
``careers/jobpost_detail_XXX.html`` where ``XXX`` is the job
posts's slug.
"""
jobposts = JobPost.objects.published()
jobpost = get_object_or_404(jobposts, slug=slug)
context = {"jobpost": jobpost, "editable_obj": jobpost}
templates = [u"careers/jobpost_detail_%s.html" % unicode(slug), template]
return render(request, templates, context)
models
from django.db import models
from django.utils.translation import ugettext_lazy as _
from mezzanine.conf import settings
from mezzanine.core.models import Displayable, RichText, Ownable
class JobPost(Displayable, RichText):
"""
A career job posting
"""
class Meta:
verbose_name = _("Job Post")
verbose_name_plural = _("Job Posts")
ordering = ("-publish_date",)
@models.permalink
def get_absolute_url(self):
url_name = "jobpost_detail"
kwargs = {"slug": self.slug}
return (url_name, (), kwargs)
def keyword_list(self):
return getattr(self, "_keywords", self.keywords.all())
urls
from django.conf.urls.defaults import patterns, url
# Job Post patterns.
urlpatterns = patterns("careers.views",
url("^tag/(?P<tag>.*)/$",
"jobpost_list",
name="jobpost_list_tag"),
url("^archive/(?P<year>\d{4})/(?P<month>\d{1,2})/$",
"jobpost_list",
name="jobpost_list_month"),
url("^archive/(?P<year>.*)/$",
"jobpost_list",
name="jobpost_list_year"),
url("^(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<slug>.*)/$",
"jobpost_detail",
name="jobpost_detail_date"),
url("^(?P<slug>.*)/$",
"jobpost_detail",
name="jobpost_detail"),
url("^$",
"jobpost_list",
name="jobpost_list"),
)