2010-11-21 3 views
1

Dans un projet Django, j'essaie de transmettre l'URL à une instance de type voulu. Les commentaires sont appliqués à un Want. J'ai essayé de comprendre cette erreur mais je suis perplexe.TypeError coercing à Unicode: besoin d'une chaîne ou d'un tampon

Cette fonction:

 def comment_email(request, comment, **kwargs): 
     want = get_object_or_404(Want, id=comment.object_pk) 
     url = want.get_absolute_url 
     print url 

jette cette erreur

Environment: 

Request Method: POST 
Request URL: http://localhost:8000/comments/post/ 
Django Version: 1.2.3 
Python Version: 2.7.0 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.admin', 
'django.contrib.comments', 
'django.contrib.markup', 
'src', 
'lib.tagging', 
'lib.markdown', 
'lib.avatar', 
'ajaxcomments', 
'south'] 
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 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ajaxcomments/utils.py" in wrapped 
    57.   return func(*args, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view 
    76.      response = view_func(request, *args, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/views/decorators/http.py" in inner 
    37.    return func(request, *args, **kwargs) 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/comments/views/comments.py" in post_comment 
    127.   request = request 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/dispatch/dispatcher.py" in send 
    162.    response = receiver(signal=self, sender=sender, **named) 
File "/Users/emilepetrone/code/apprentice2/src/utils.py" in comment_email 
    24. print url 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/base.py" in __repr__ 
    344.    u = unicode(self) 

Exception Type: TypeError at /comments/post/ 
Exception Value: coercing to Unicode: need string or buffer, Want found 

Voici le modèle Want:

 class Want(models.Model): 

     pub_date =   models.DateTimeField(default=datetime.now,auto_now_add=True,db_index=True) 
     body = models.TextField(default='',max_length=1000) 
     body_html = models.TextField(editable=False, blank=True) 

     #Metadata 
     mentee = models.ForeignKey(User) 
     points = models.IntegerField(default=3) 
     enable_comments = models.BooleanField(default=True) 
     featured = models.BooleanField(default=False) 

     #Tags 
     tags = TagField(help_text="Autocomplete") 

     def get_tags(self): 
     return Tag.objects.get_for_object(self)  

     class Meta: 
     ordering = ['-pub_date'] 

     def __unicode__(self): 
     return self 

     def save(self): 
     self.body_html = markdown(self.body) 
     super(Want, self).save() 

     def get_absolute_url(self): 
     return ({ 'object_id': self.id }) 
     get_absolute_url = models.permalink(get_absolute_url) 

Merci pour votre aide!

+0

Vous aurez besoin de publier le retraçage complet. –

+0

Daniel, vient de l'ajouter. Merci – Emile

Répondre

7

Je pense que le problème est

def __unicode__(self): 
    return self 

qui doit retourner une chaîne de caractères Unicode plutôt que d'une instance « Voulez-vous ». Je ne suis pas sûr de ce que vous voulez à la place - peut-être "self.id"

+0

J'ai pensé à la want.get_absolute_url(), mais pas une telle chance. Avec la première supposition, "self.id" - voulez-vous dire retour self.id? – Emile

+0

__unicode __() est censé renvoyer une chaîne unicode, par exemple une chaîne vide serait même valide, mais son retour actuel "self" est une instance Want et non une chaîne unicode. En ce qui concerne la chaîne spécifique - ne sachant pas votre code, ou les objectifs - je devine juste que "self.id" est une chaîne unicode valide qui conviendrait à vos fins. – mjhm

+0

Oui, j'ai effectivement enlevé le def __unicode__ et cela fonctionne comme un charme. Merci – Emile

Questions connexes