2013-04-23 5 views
42

ho questo errore da molto tempo, ma non riesco a capirlo:costringe a Unicode: stringa di necessità o di tampone, NoneType trovato quando il rendering in Django Admin

Preso TypeError durante il rendering: costringere a Unicode: necessità stringa o di buffer, NoneType trovato

succede in admin quando cerco di aggiungere o modificare su uno dei miei modelli (display funziona bene)

Questo è il modello:

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

Qualche idea di cosa sto sbagliando qui?

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 
+0

perché la mancanza di 'da/import' e duplicare' da/import' tutti dello stesso modulo? – KevinDTimm

+0

vedo '{% per campo in riga%}', che cos'è 'line'? – rednaw

+0

@rednaw Its In template /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/includes/fieldset.html Quindi non so o – Armance

risposta

77

Questo errore si verifica quando si dispone di un metodo __unicode__ che è una restituzione di un campo che non è entrato. Qualsiasi campo vuoto è None e Python non può convertire None, in modo da ottenere l'errore.

Nel tuo caso, il problema più probabile è con il metodo PCE del modello __unicode__, in particolare il suo campo di ritorno.

È possibile evitare questo restituendo un valore di default:

def __unicode__(self): 
    return unicode(self.some_field) or u'' 
+22

Per inciso (per coloro che potrebbero avere gli occhi cisposi da una tarda notte), può anche essere causato da * non restituire nulla * nel '__unicode__'. :) – cloudrave

+1

Anche se il campo dell'oggetto sembra corretto su una pagina Modifica, è possibile avere questo quando uno dei campi correlati '__unicode__' restituisce Nessuno! – kissgyorgy

-5

primo luogo, verificare che tutto ciò che si sta tornando via unicode è una stringa.

Se non è una stringa si può cambiare in una stringa come questo (dove self.id è un numero intero)

def __unicode__(self): 
    return '%s' % self.id 

a seguito della quale, se ancora non funziona, riavviare il ./ manage.py shell per rendere effettive le modifiche e riprovare. Dovrebbe funzionare.

migliori saluti

+1

No. Qualunque cosa si restituisce tramite '__unicode__' deve essere un oggetto * unicode *, non un bytestring. Usa 'unicode (self.id)' o, se necessario, 'u'% s '% self.id'. (È vero che in questo caso la risposta funzionerà perché l'ID sarà sempre un numero intero, ma le risposte dovrebbero dare l'implementazione corretta e non qualcosa che funziona per caso.) –

10

Questo errore può verificarsi quando si torna un oggetto invece di una stringa nel metodo __unicode__. Per esempio:

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


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

Per evitare questo errore si può lanciare l'istanza autore a unicode:

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

Nel mio caso si trattava di qualcosa di diverso: l'oggetto stavo salvando deve prima avere un id (per esempio save() dovrebbe essere chiamato) prima che potessi impostare qualsiasi tipo di relazione con esso.

0

Il valore di ritorno def __unicode __ dovrebbe essere simile al valore di ritorno dei relativi modelli (tabelle) per la corretta visualizzazione di "some_field" nel pannello di amministrazione di django. È inoltre possibile utilizzare:

def __str__(self): 
    return self.some_field 
Problemi correlati