2010-07-16 4 views
0

Je suis en cours d'exécution d'une installation Django avec GeoDjango et ont créé un modèle comme celui-ci:GeoDjango - forçant à Unicode: chaîne de besoin ou d'un tampon, LineString trouvé

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

Cela a fonctionné, et j'ai pu créer Les objets linestring, dans le terminal, et je ne les ai jamais vraiment montrés, mais c'était plus mon affichage n'étant pas encore terminé. Mais ensuite j'ai vu un screencast, bien qu'à partir de 2008, avec le créateur de geodjango - bronn, où il a obtenu un openlayer Open Map Map inteface sur la page d'administration, et j'ai suivi ses instructions en ajoutant un admin.py avec une fin OSMGeoAdmin comme ceci:

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

cela fonctionne aussi très bien - je reçois une carte sur laquelle je peux dessiner un linestring, mais lorsque je tente de le sauver - ou si j'ai un objet route déjà créé et essayer de voir la liste de Route sur adminpage - Je reçois une erreur. Plus précisément "coercition à Unicode: besoin de chaîne ou de tampon, LineString a trouvé" et d'après ce que je comprends cela vient d'essayer d'unicode un objet qui n'a pas une fonction __ unicode__ (ou quelque chose comme ça).

J'ai donc vérifié la définition de l'objet linestring et il n'y avait pas de fonction Unicode. J'ai donc tenté faiblement d'en ajouter un, sans aucune chance.

Donc, je suis là, perplexe. Quelqu'un sait comment je peux résoudre ce problème?

modifier 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 
+1

Pouvez-vous poster la pleine stacktrace? – godswearhats

+0

modifié et ajouté stacktrace – useless

Répondre

0

j'ai pu dupliquer votre trace de la pile par ce qui suit:

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 

Je chargé la page d'administration avec name défini comme un CharField, puis a changé le modèle la définition est LineStringField. Lorsque j'ai enregistré la page, j'ai eu la même erreur. En tant que tel, je suppose que c'est un problème de données - est-ce que votre définition de modèle correspond à la définition de la colonne dans la base de données? Vous pourriez essayer de laisser tomber cette table et courir encore manage.py syncdb.

+0

Merci pour le conseil, mais j'ai essayé de laisser tomber, rinçage, réinitialisation de la base de données un certain nombre de fois et l'erreur apparaît toujours. Une autre idée?: S – useless

1

Pas besoin de chercher un autre chemin, Seth est rigth!

def La fonction unicode attend une chaîne. Vous devez donc mettre un champ de type Caractère dans la partie "retour".

Cela devrait fonctionner:

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 
Questions connexes