[django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 07:34
Оценка:
Если в админке открыть список записей какой-либо таблицы, то они отображаются корректно. Но если щелкнуть на запись, для того, чтобы получить доступ к остальным ее полям то появляется ошибка:

TemplateSyntaxError at /admin/Books/review/43/

Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

Request Method: GET
Request URL: http://127.0.0.1:8000/admin/Books/review/43/
Django Version: 1.2.3
Exception Type: TemplateSyntaxError
Exception Value:

Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)

Exception Location: c:\Python27\lib\site-packages\django\utils\encoding.py in force_unicode, line 69
Python Executable: c:\Python27\python.exe
Python Version: 2.7.0
Python Path: ['c:\\artefacts\\workspace\\BookMixToFb2\\src\\BookMixToFb2', 'C:\\Windows\\system32\\python27.zip', 'c:\\Python27\\DLLs', 'c:\\Python27\\lib', 'c:\\Python27\\lib\\plat-win', 'c:\\Python27\\lib\\lib-tk', 'c:\\Python27', 'c:\\Python27\\lib\\site-packages']
Server time: Wed, 6 Oct 2010 11:31:26 +0400

Template error

In template c:\python27\lib\site-packages\django\contrib\admin\templates\admin\change_form.html, error at line 21
Caught UnicodeEncodeError while rendering: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
11
12 {% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
13
14 {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
15
16 {% block breadcrumbs %}{% if not is_popup %}
17 <div class="breadcrumbs">
18 <a href="../../../">{% trans "Home" %}</a> &rsaquo;
19 <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
20 {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo;
21 {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
22 </div>
23 {% endif %}{% endblock %}
24
25 {% block content %}<div id="content-main">
26 {% block object-tools %}
27 {% if change %}{% if not is_popup %}
28 <ul class="object-tools"><li><a href="history/" class="historylink">{% trans "History" %}</a></li>
29 {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
30 </ul>
31 {% endif %}{% endif %}


Запись в базу данных осуществляется так:
title = unicode(element.title).encode("UTF-8") 
r = Review(title = title)


В моих шаблонах все отображается корректно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re: [django] Кирилица в админке
От: Daevaorn Россия  
Дата: 06.10.10 07:46
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Если в админке открыть список записей какой-либо таблицы, то они отображаются корректно. Но если щелкнуть на запись, для того, чтобы получить доступ к остальным ее полям то появляется ошибка:


DAS>Запись в базу данных осуществляется так:

DAS>
DAS>title = unicode(element.title).encode("UTF-8") 
DAS>r = Review(title = title)
DAS>


DAS>В моих шаблонах все отображается корректно.


В базу нужно складывать уникодные объекты, а не байтовые строки. encode лишний
Re[2]: [django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 08:29
Оценка:
Здравствуйте, Daevaorn, Вы писали:

D>В базу нужно складывать уникодные объекты, а не байтовые строки. encode лишний


Поправил, но результат остался прежним.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[2]: [django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 08:45
Оценка:
Здравствуйте, Daevaorn, Вы писали:

А как вообще Django определяет, какое именно поле будет отображаться в админке в списке записей (здесь: http://127.0.0.1:8000/admin/app_name/table_name/)?

Поясню свою мысль. У меня вот такая модель:
class Review(models.Model):
    title = models.CharField(max_length = 50)
    review_id = models.IntegerField()    
    book_id = models.IntegerField()    
    link = models.CharField(max_length = 100)
    content = models.TextField()
    rating = models.IntegerField()
    author = models.CharField(max_length = 50)


Соответственно, на форме http://127.0.0.1:8000/admin/books/reviews/ для каждой записи у меня отображается поле title. При щелчке на этот title открывается карточка со всеми полями выбранной записи.
Если title содержит кирилические символы, то при открытии карточки записи я получаю ошибку. Если не содержит — то ошибки нет. Не смотря на то, что в поле Content есть кирилица.

Отсюда у меня возникло подозрение, что проблема в том, что кирилица именно в том поле, которое отображается в списке записей и я стал пытаться протолкнуть в это поле любое другое (пусть даже фиктивное поле).

Сначала я вынес числовые поля вперед, предположив что в списиок попадает первое поле:

class Review(models.Model):
    review_id = models.IntegerField()    
    book_id = models.IntegerField()    
    title = models.CharField(max_length = 50)
    link = models.CharField(max_length = 100)
    content = models.TextField()
    rating = models.IntegerField()
    author = models.CharField(max_length = 50)


Снес старую базу данных, синхронизировал — все по прежнему — title в списке.

Добавил новое фиктивное поле, которое просто заполняю статичным значнием 'latin':

class Review(models.Model):
      latin = models.CharField(max_length = 50)
    review_id = models.IntegerField()    
    book_id = models.IntegerField()    
    title = models.CharField(max_length = 50)
    link = models.CharField(max_length = 100)
    content = models.TextField()
    rating = models.IntegerField()
    author = models.CharField(max_length = 50)


но все равно в списке записей отображается поле title
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[3]: [django] Кирилица в админке
От: Курилка Россия http://kirya.narod.ru/
Дата: 06.10.10 08:52
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, Daevaorn, Вы писали:


D>>В базу нужно складывать уникодные объекты, а не байтовые строки. encode лишний


DAS> Поправил, но результат остался прежним.


крутится под чем?
у меня была проблема с тем, что у апача была некорректная локаль, рецепт на джанговики был, сейчас найти чтот не могу
Re[4]: [django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 08:59
Оценка:
Здравствуйте, Курилка, Вы писали:

К>крутится под чем?


python.exe manage.p runserver
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re: [django] Кирилица в админке
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.10.10 10:17
Оценка: 4 (1)
Здравствуйте, DemAS, Вы писали:

В %PYTHON_HOME%\Lib\site.py найди ф-ю setencoding() и, если там имеет место:

encoding = "ascii" # Default value set by _PyUnicode_Init()


измени на

encoding = "utf-8"


ну, или

reload(sys)
sys.setdefaultencoding("utf-8")
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: [django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 10:46
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

Да, спасибо. Помогло.
А это стандартный хак? Почему это в настройки не вынесено?
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[3]: [django] Кирилица в админке
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.10.10 11:04
Оценка:
Здравствуйте, DemAS, Вы писали:

DAS>Здравствуйте, kochetkov.vladimir, Вы писали:


DAS> Да, спасибо. Помогло.

DAS> А это стандартный хак? Почему это в настройки не вынесено?

Это относится к python, а не к django: http://www.python.org/dev/peps/pep-0100/
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: [django] Кирилица в админке
От: DemAS http://demas.me
Дата: 06.10.10 11:37
Оценка:
Здравствуйте, DemAS, Вы писали:

Ответ, но мой же вопрос здесь http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

В моем случае у меня просто метод __str__() у модели был перекрыт.
Более грамотно можно сделать так: в файле admin.py в приложении реализовать еще один класс и зарегистрировать его примерно так:

from django.contrib import admin
from models import Review

class ReviewAdmin(admin.ModelAdmin):
    list_display = ('book_id', 'review_id', 'title')

admin.site.register(Review, ReviewAdmin)
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.