принуждение к Unicode: нужна строка или буфер, NoneType найден при рендеринге в Django admin


у меня есть эта ошибка с давних пор, но не могу понять:

поймал TypeError при рендеринге: принуждение к Unicode: нужна строка или буфер, NoneType found

это происходит в admin, когда я пытаюсь добавить или изменить на одной из моих моделей (дисплей работает нормально)

Это модели:

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

есть идеи, что я делаю неправильно здесь?

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
5 52

5 ответов:

эта ошибка происходит, когда у вас есть __unicode__ метод, который возвращает поле, которое не введено. Любое пустое поле None и Python не может преобразовать None, Так что вы получите ошибку.

в вашем случае, проблема скорее всего с PCE модель __unicode__ метод, в частности, в поле его возвращения.

вы можете предотвратить это, вернув значение по умолчанию:

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

эта ошибка может возникнуть при возврате объекта вместо строки в __unicode__ метод. Например:

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


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

чтобы избежать этой ошибки, вы можете привести экземпляр author в unicode:

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

в моем случае это было что-то другое: объект, который я сохранял, должен сначала иметь идентификатор(например, save() должен быть вызван), прежде чем я смогу установить с ним какие-либо отношения.

возвращаемое значение def _ _ unicode __ должно быть аналогично возвращаемому значению соответствующих моделей (таблиц) для корректного просмотра "some_field" в панели администратора django. Вы также можете использовать:

def __str__(self):
    return self.some_field

во-первых, проверьте, что все, что вы возвращаете через unicode - это строка.

Если это не строка, вы можете изменить ее на такую строку (где self.id является целым числом)

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

после чего, если он все еще не работает, перезапустите ваш ./manage.py оболочка для изменения вступают в силу и повторите попытку. Это должно сработать.

С Наилучшими Пожеланиями