geoDjango - приведение к Unicode: нужна строка или буфер, найдена LineString - PullRequest
0 голосов
/ 16 июля 2010

Я запускаю установку Django с помощью geoDjango и создал такую ​​модель:

#models.py
from django.contrib.gis.db import models

class Route(models.Model):
    name = models.CharField(max_length=100)

    path = models.LineStringField(srid=4326)
    objects = models.GeoManager()

    def __unicode__(self):
        return str(self.path)

Это сработало, и я смог создать объекты линейных строк в терминале, и, по общему признанию, я так и не смог их реально отобразить, но это было больше с моим отображением, еще не полностью завершенным.

Но потом я увидел скринкаст, хотя с 2008 года с создателем геоджанго - бронном, где он получил открытый интерфейс карты улиц на странице администратора, и я следовал его инструкциям, добавляя admin.py с OSMGeoAdmin, заканчивающимся как это:

#admin.py
from django.contrib.gis import admin
from myproject.georoute.models import Route


class RouteAdmin(admin.OSMGeoAdmin):
    search_fields = ('name',)

admin.site.register(Route, RouteAdmin)

Это также работает нормально - я получаю карту, на которой могу нарисовать линейную строку, но когда я пытаюсь ее сохранить - или если у меня уже есть объект Маршрут и пытаюсь просмотреть список Маршрутов на странице администратора - я получаю ошибка. В частности, "приведение к Unicode: нужна строка или буфер, LineString найдена" , и, насколько я понимаю, это происходит из-за попытки unicode-объекта, который не имеет функции __unicode__ (или что-то вроде этого).

Итак, я проверил определение объекта линейной строки, и не было никакой функции Юникода, поэтому я сделал слабую попытку добавить одну, но безуспешно.

Итак, я в тупике. Кто-нибудь знает, как я могу решить эту проблему?

редактировать StackTrace:

Environment:

Request Method: POST
Request URL: http://storm.webfactional.com/admin/georoute/route/add/
Django Version: 1.2.1
Python Version: 2.6.5
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.gis',
 'django.contrib.admin',
 'registration',
 'georoute']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/home/storm/webapps/django/lib/python2.6/django/core/handlers/base.py" in get_response
  100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py" in wrapper
  239.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/views/decorators/cache.py" in _wrapped_view_func
  69.         response = view_func(request, *args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/contrib/admin/sites.py" in inner
  190.             return view(request, *args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py" in _wrapper
  21.             return decorator(bound_func)(*args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py" in _wrapped_view
  76.                     response = view_func(request, *args, **kwargs)
File "/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py" in bound_func
  17.                 return func(self, *args2, **kwargs2)
File "/home/storm/webapps/django/lib/python2.6/django/db/transaction.py" in _commit_on_success
  299.                     res = func(*args, **kw)
File "/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py" in add_view
  800.                 self.log_addition(request, new_object)
File "/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py" in log_addition
  428.             object_repr     = force_unicode(object),
File "/home/storm/webapps/django/lib/python2.6/django/utils/encoding.py" in force_unicode
  66.                 s = unicode(s)

Exception Type: TypeError at /admin/georoute/route/add/
Exception Value: coercing to Unicode: need string or buffer, LineString found

Ответы [ 2 ]

1 голос
/ 04 сентября 2013

Не нужно искать другой путь, Сет прав!

def Юникод Функция ожидает строку. Таким образом, вы должны поместить поле типа Character в часть 'return'.

Это должно работать:

from django.contrib.gis.db import Models
# model from the tutorial
class WorldBorders(models.Model):
    name = models.CharField(max_length=50)
    path = models.LineStringField(srid=4326)
    ...
    def __unicode__(self):
        return self.name
0 голосов
/ 17 июля 2010

Мне удалось скопировать вашу трассировку стека следующим образом:

from django.contrib.gis.db import Models
# model from the tutorial
class WorldBorders(models.Model):
    #name = models.CharField(max_length=50)
    name = models.LineStringField(srid=4326)
    ...
    def __unicode__(self):
        return self.name

Я загрузил страницу администратора с name, определенным как CharField, затем изменил определение модели на LineStringField. Когда я сохранил страницу, я получил ту же ошибку.

Поэтому я подозреваю, что это проблема с данными - соответствует ли определение вашей модели определению столбца в базе данных? Вы можете попробовать сбросить эту таблицу и снова запустить manage.py syncdb.

...