0

我正在使用 geoDjango 运行 Django 安装,并创建了这样的模型:

#models.py
从 django.contrib.gis.db 导入模型

类路线(模型。模型):
    名称 = models.CharField(max_length=100)

    路径 = 模型.LineStringField(srid=4326)
    对象 = 模型.GeoManager()

    def __unicode__(self):
        返回 str(self.path)

这行得通,我能够在终端中创建线串对象,并且诚然我从来没有让它们真正显示出来,但这更多是因为我的显示还没有完全完成。

但后来我看到了一个截屏视频,虽然是从 2008 年开始,geodjango 的创建者 - bronn,他在管理页面上获得了一个 openlayer 开放街道地图接口,我按照他的说明添加了一个带有 OSMGeoAdmin 的 admin.py,结果如下:

#admin.py
从 django.contrib.gis 导入管理员
从 myproject.georoute.models 导入路线


类 RouteAdmin(admin.OSMGeoAdmin):
    search_fields = ('名字',)

admin.site.register(Route, RouteAdmin)

这也可以正常工作 - 我得到一张可以在其上绘制线串的地图,但是当我尝试保存它时 - 或者如果我已经创建了一个 Route 对象并尝试在管理页面上查看 Route 列表 - 我得到一个错误。更具体地说,“强制转换为 Unicode:需要字符串或缓冲区,找到 LineString”,据我了解,这来自于尝试对没有 __ unicode__ 函数(或类似函数)的对象进行 unicode 编码。

所以我检查了线串对象定义并且没有 unicode 函数所以我做了一个微弱的尝试添加一个,但没有运气。

所以我在这里,难住了。任何人都知道我可以如何解决这个问题?

编辑堆栈跟踪:

环境:

请求方法:POST
请求网址:http://storm.webfactional.com/admin/georoute/route/add/
Django 版本:1.2.1
Python版本:2.6.5
已安装的应用程序:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.gis',
 'django.contrib.admin',
 '登记',
 '地理路线']
已安装的中间件:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


追溯:
get_response 中的文件“/home/storm/webapps/django/lib/python2.6/django/core/handlers/base.py”
  100.响应=回调(请求,*callback_args,**callback_kwargs)
包装器中的文件“/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py”
  239. return self.admin_site.admin_view(view)(*args, **kwargs)
_wrapped_view 中的文件“/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py”
  76. 响应 = view_func(请求,*args,**kwargs)
_wrapped_view_func 中的文件“/home/storm/webapps/django/lib/python2.6/django/views/decorators/cache.py”
  69. response = view_func(request, *args, **kwargs)
内部文件“/home/storm/webapps/django/lib/python2.6/django/contrib/admin/sites.py”
  190. 返回视图(请求,*args,**kwargs)
_wrapper 中的文件“/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py”
  21. 返回装饰器(bound_func)(*args, **kwargs)
_wrapped_view 中的文件“/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py”
  76. 响应 = view_func(请求,*args,**kwargs)
bound_func 中的文件“/home/storm/webapps/django/lib/python2.6/django/utils/decorators.py”
  17. 返回函数(自我,*args2,**kwargs2)
_commit_on_success 中的文件“/home/storm/webapps/django/lib/python2.6/django/db/transaction.py”
  299. res = func(*args, **kw)
add_view 中的文件“/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py”
  800. self.log_addition(请求,新对象)
log_addition 中的文件“/home/storm/webapps/django/lib/python2.6/django/contrib/admin/options.py”
  428. object_repr = force_unicode(对象),
force_unicode 中的文件“/home/storm/webapps/django/lib/python2.6/django/utils/encoding.py”
  66. s = unicode(s)

异常类型:/admin/georoute/route/add/ 处的 TypeError
异常值:强制转换为 Unicode:需要字符串或缓冲区,找到 LineString
4

2 回答 2

1

无需寻找其他方式,赛斯是正确的!

def unicode函数需要一个字符串。所以你必须在'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
于 2013-09-04T15:44:18.980 回答
0

我能够通过以下方式复制您的堆栈跟踪:

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定义为 a的管理页面CharField,然后将模型定义更改为 a LineStringField。当我保存页面时,我得到了同样的错误。

因此,我怀疑这是一个数据问题 - 您的模型定义是否与数据库中的列定义匹配?您可以尝试删除该表并manage.py syncdb再次运行。

于 2010-07-17T03:28:24.183 回答