web-dev-qa-db-fra.com

contraindre à Unicode: chaîne ou tampon nécessaire, aucun type trouvé lors du rendu dans l'administrateur Django

J'ai cette erreur depuis longtemps mais je n'arrive pas à le comprendre:

Caught TypeError lors du rendu: contraindre à utiliser Unicode: chaîne requise ou mémoire tampon, NoneType trouvé

Cela se produit dans l'administrateur lorsque j'essaie d'ajouter ou de modifier un de mes modèles (l'affichage fonctionne bien)

Voici le modèle:

class PS(models.Model):
    id_ps = models.IntegerField(null=True)
    client = models.ForeignKey(Client, null=True, blank=True)
    nom_du_site = models.CharField(max_length=250)
    rue_livraison = models.TextField(null=True)
    complement_adresse = models.TextField(null=True)
    code_postal_livraison = models.CharField(max_length=50, null=True)
    ville_livraison = models.CharField(max_length=200, null=True)
    pays_livraison = models.CharField(max_length=200, null=True)
    distributeur = models.CharField(max_length=50, null=True)
    tarif = models.CharField(max_length=250, null=True)
    type_tarif = models.CharField(max_length=50, null=True)
    type_installation = models.CharField(max_length=50, null=True)

    def __unicode__(self):
        return self.nom_du_site

    @property
    def pce(self):        
        try:
            return PCE.objects.filter(ps=self)[0]
        except IndexError:
            return
    #    
    def get_pce(self):
        from pce.models import PCE
        return PCE.objects.filter(ps=self).exclude(frequence='6M')
    #
    def get_pce_6m(self):
        from pce.models import PCE
        return PCE.objects.filter(ps=self,frequence='6M') 

Une idée de ce que je fais mal ici?

Traceback:

    Environment:

    Request Method: GET
    Request URL: http://127.0.0.1:8026/admin/ps/ps/add/
    Django Version: 1.2.5
    Python Version: 2.7.2
    Installed Applications:
    ['Django.contrib.auth',
     'Django.contrib.contenttypes',
     'Django.contrib.sessions',
     'Django.contrib.sites',
     'Django.contrib.messages',
     'Django.contrib.admin',
     'easy_thumbnails',
     'Django_extensions',
     'contentadmin',
     'south',
     'sentry',
     'sentry.client',
     'indexer',
     'file_uploader',
     'paging',
     'pagination',
     'consommation',
     'ps',
     'pce',
     'profil',
     'analytics',
     'document']
    Installed Middleware:
    ('annoying.middlewares.StaticServe',
     'Django.middleware.common.CommonMiddleware',
     'Django.contrib.sessions.middleware.SessionMiddleware',
     'Django.middleware.csrf.CsrfViewMiddleware',
     'Django.contrib.auth.middleware.AuthenticationMiddleware',
     'Django.contrib.messages.middleware.MessageMiddleware',
     'pagination.middleware.PaginationMiddleware')


    Template error:
    In template /usr/local/lib/python2.7/dist-packages/Django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
       Caught TypeError while rendering: coercing to Unicode: need string or buffer, NoneType found
       9 :             {% for field in line %}


       10 :                 <div{% if not line.fields|length_is:'1' %} class="field-box{% if not field.is_readonly and field.errors %} errors{% endif %}"{% endif %}>


       11 :                     {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}


       12 :                     {% if field.is_checkbox %}


       13 :                         {{ field.field }}{{ field.label_tag }}


       14 :                     {% else %}


       15 :                         {{ field.label_tag }}


       16 :                         {% if field.is_readonly %}


       17 :                             <p>{{ field.contents }}</p>


       18 :                         {% else %}


       19 :                              {{ field.field }} 


       20 :                         {% endif %}


       21 :                     {% endif %}


       22 :                     {% if field.field.field.help_text %}


       23 :                         <p class="help">{{ field.field.field.help_text|safe }}</p>


       24 :                     {% endif %}


       25 :                 </div>


       26 :             {% endfor %}


       27 :         </div>


       28 :     {% endfor %}


       29 : </fieldset>


    Traceback:
    File "/usr/local/lib/python2.7/dist-packages/Django/core/handlers/base.py" in get_response
      100.                     response = callback(request, *callback_args, **callback_kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/options.py" in wrapper
      288.                 return self.admin_site.admin_view(view)(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/decorators.py" in _wrapped_view
      76.                     response = view_func(request, *args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/views/decorators/cache.py" in _wrapped_view_func
      78.         response = view_func(request, *args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/sites.py" in inner
      190.             return view(request, *args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/decorators.py" in _wrapper
      21.             return decorator(bound_func)(*args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/decorators.py" in _wrapped_view
      76.                     response = view_func(request, *args, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/decorators.py" in bound_func
      17.                 return func(self, *args2, **kwargs2)
    File "/usr/local/lib/python2.7/dist-packages/Django/db/transaction.py" in _commit_on_success
      299.                     res = func(*args, **kw)
    File "/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/options.py" in add_view
      909.         return self.render_change_form(request, context, form_url=form_url, add=True)
    File "/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/options.py" in render_change_form
      692.         ], context, context_instance=context_instance)
    File "/usr/local/lib/python2.7/dist-packages/Django/shortcuts/__init__.py" in render_to_response
      20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/loader.py" in render_to_string
      186.     return t.render(context_instance)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      173.             return self._render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in _render
      167.         return self.nodelist.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/loader_tags.py" in render
      125.         return compiled_parent._render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in _render
      167.         return self.nodelist.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/loader_tags.py" in render
      125.         return compiled_parent._render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in _render
      167.         return self.nodelist.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/loader_tags.py" in render
      62.             result = block.nodelist.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/defaulttags.py" in render
      174.                 nodelist.append(node.render(context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/loader_tags.py" in render
      139.             return self.template.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      173.             return self._render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in _render
      167.         return self.nodelist.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/defaulttags.py" in render
      174.                 nodelist.append(node.render(context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/defaulttags.py" in render
      174.                 nodelist.append(node.render(context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/defaulttags.py" in render
      260.             return self.nodelist_false.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/defaulttags.py" in render
      260.             return self.nodelist_false.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/__init__.py" in render
      796.                 bits.append(self.render_node(node, context))
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render_node
      72.             result = node.render(context)
    File "/usr/local/lib/python2.7/dist-packages/Django/template/debug.py" in render
      91.             output = force_unicode(output)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/encoding.py" in force_unicode
      66.                 s = unicode(s)
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/forms.py" in __unicode__
      408.         return self.as_widget()
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/forms.py" in as_widget
      450.         return widget.render(name, data, attrs=attrs)
    File "/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/widgets.py" in render
      247.         output = [self.widget.render(name, value, *args, **kwargs)]
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/widgets.py" in render
      447.         options = self.render_options(choices, [value])
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/widgets.py" in render_options
      464.         for option_value, option_label in chain(self.choices, choices):
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/models.py" in __iter__
      898.                 yield self.choice(obj)
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/models.py" in choice
      904.         return (self.field.prepare_value(obj), self.field.label_from_instance(obj))
    File "/usr/local/lib/python2.7/dist-packages/Django/forms/models.py" in label_from_instance
      955.         return smart_unicode(obj)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/encoding.py" in smart_unicode
      39.     return force_unicode(s, encoding, strings_only, errors)
    File "/usr/local/lib/python2.7/dist-packages/Django/utils/encoding.py" in force_unicode
      66.                 s = unicode(s)

    Exception Type: TemplateSyntaxError at /admin/ps/ps/add/
    Exception Value: Caught TypeError while rendering: coercing to Unicode: need string or buffer, NoneType found
54
Armance

Cette erreur se produit lorsque vous utilisez une méthode __unicode__ qui renvoie un champ non entré. Tous les champs vides sont None et Python ne peut pas convertir None. Vous obtenez donc l'erreur.

Dans votre cas, le problème le plus probable est lié à la méthode __unicode__ du modèle PCE, plus précisément au champ qu’elle renvoie.

Vous pouvez empêcher cela en renvoyant une valeur par défaut:

def __unicode__(self):
   return unicode(self.some_field) or u''
87
Burhan Khalid

Cette erreur peut se produire lorsque vous retournez un objet au lieu d'une chaîne dans votre méthode __unicode__. Par exemple:

class Author(models.Model):
    . . . 
    name = models.CharField(...)


class Book(models.Model):
    . . .
    author = models.ForeignKey(Author, ...)
    . . .
    def __unicode__(self):
        return self.author  # <<<<<<<< this causes problems

Pour éviter cette erreur, vous pouvez convertir l'instance d'auteur en unicode:

class Book(models.Model):
    . . . 
    def __unicode__(self):
        return unicode(self.author)  # <<<<<<<< this is OK
12
Boris Chervenkov

Dans mon cas, c’était quelque chose d’autre: l’objet que je sauvegardais devait d’abord avoir un identifiant (par exemple, save () devrait être appelé) avant que je puisse définir un type de relation avec lui.

1
Patrick Bassut

Remplacez la fonction précédente par celle fournie. La solution la plus simple est:

def __unicode__(self):

    return unicode(self.nom_du_site)
0
Ank_247shbm

La valeur de retour def __unicode __ doit être similaire à la valeur de retour des modèles associés (tables) pour une visualisation correcte de "some_field" dans le panneau d'administration Django . Vous pouvez également utiliser:

def __str__(self):
    return self.some_field
0
Ronny Morán