#python #unicode #django-1.6
#python #юникод #django-1.6
Вопрос:
У меня есть приложение django версии 1.2.3, обновленное до 1.6.5, и приложение работает нормально, но URL-адрес администратора не работает, и при обращении к нему я сталкиваюсь с приведенной ниже ошибкой localhost:8000/admin/
Обратная трассировка
Traceback:
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/contrib/admin/sites.py" in wrapper
215. return self.admin_view(view, cacheable)(*args, **kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
99. response = view_func(request, *args, **kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
52. response = view_func(request, *args, **kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
198. return view(request, *args, **kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
52. response = view_func(request, *args, **kwargs)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/contrib/admin/sites.py" in index
358. model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name)
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/urlresolvers.py" in reverse
503. app_list = resolver.app_dict[ns]
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/urlresolvers.py" in app_dict
329. self._populate()
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/urlresolvers.py" in _populate
290. for name in pattern.reverse_dict:
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/urlresolvers.py" in reverse_dict
315. self._populate()
File "/Users/user/.envs/proj/lib/python2.7/site-packages/django/core/urlresolvers.py" in _populate
278. lookup_str = callback.__module__ "." callback.__name__
Exception Type: TypeError at /admin/
Exception Value: coercing to Unicode: need string or buffer, instancemethod found
И когда я перевел версию django на 1.5.3, она работает без ошибок, так что не так с последней версией, нужно ли нам вносить какие-либо изменения в настройки Юникода?
Редактировать:
urls.py
from django.conf.urls import *
from django.conf import settings
from django.contrib import admin
from django.views.generic import TemplateView
from feeds.sitemap import SITEMAP
admin.autodiscover()
urlpatterns = patterns('',
# Core Website Pages
(r'^$', 'core.views.homepage'),
# Site Map
(r'^sitemap.xml$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': SITEMAP}),
# Admin pages
(r'^admin/', include(admin.site.urls)),
(r'^search/', include('search.urls')),
)
# Static Content Code, Used Only For Development
import os.path
static = os.path.join(
os.path.dirname(__file__), 'media'
)
new_static = os.path.join(
os.path.dirname(__file__), 'new_media'
)
if settings.DEBUG:
urlpatterns = patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': static}),
(r'^new_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': new_static}),
)
search/urls.py
from django.conf.urls import *
from search.views import SiteSearch
urlpatterns = patterns('search.views',
url(r'^$', SiteSearch(), name='site_search'),
)
search/views.py
from haystack.views import SearchView
class SiteSearch(SearchView):
def get_results(self):
model_search_form = self.form_class(self.request.GET)
model_search_form.is_valid()
models = model_search_form.get_models()
if self.query:
search_results = self.form.search()
if len(models) == 1 and models[0].__name__ == 'Press_Releases':
search_results = search_results.order_by('-date')
return search_results
return []
Комментарии:
1.В частности, один из ваших методов просмотра
__name__
, по-видимому, имеет__module__
метод or .2. Итак, мое приложение было огромным, которое поддерживалось годами, поэтому у меня было настроено много сторонних приложений, и у меня было это
__module__
во многих местах, так что это вызывало ошибку?3. Ваше первое
patterns()
определение является неполным; закрытие)
отсутствует. Обслуживание статических файлов было переработано в 1.3, см. docs.djangoproject.com/en/1.6/howto/static-files4. Представление для обслуживания статических файлов теперь названо
django.contrib.staticfiles.views.serve
, возможно, это большое изменение здесь.5. @MartijnPieters: Извините, это была просто опечатка при вставке в SO, и попытался заменить старое представление на ‘django.contrib.staticfiles.views.serve’ и по-прежнему сталкивается с той же ошибкой
Ответ №1:
Ваше исключение вызвано более старой версией Django-Haystack. Обновите его, он несовместим с Django 1.6.
По крайней мере, в версии 1.0 SearchView
класс определяется __name__
как метод, что противоречит обычному использованию в Python, где этот атрибут вместо этого является строкой.
Комментарии:
1. Я сделал много настроек для haystack, поэтому, если я обновлюсь, мне нужно снова перенастроить приложение: (
2. @shivakrishna: затем обновите небольшими шагами. у 1.1, похоже, нет этой проблемы.
3. хорошо, конечно, я думаю, что в любом случае лучше перейти на более новую версию, но каково именно фактическое использование
__name__
метода в python (может быть, это основной вопрос python, но вы хотите знать его словами такого фаната python, как вы), его удаление вызовет какие-либо проблемы?4. @shivakrishna: смотрите Модель данных для классов —
__name__
это имя класса. Это используется при самоанализе.