приведение к Юникоду: нужна строка или буфер, метод экземпляра найден после обновления django с 1.2.3 до 1.6.5

#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-files

4. Представление для обслуживания статических файлов теперь названо 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__ это имя класса. Это используется при самоанализе.