admin中出错:__str__返回非字符串(类型NoneType)

时间:2017-02-14 15:24:10

标签: django admin models typeerror

在尝试将实例添加到我的某个模型时,admin会返回此错误。模型本身具有正确的 str ()方法,并且不包含任何实例。还尝试用静态方法替换 str ()方法或完全删除它。没有运气。

错误似乎指向管理员的历史记录部分出现问题。 Stacktrace指向第33行。

Error during template rendering

In template /Users/snirp/juis/snirpdrive/glotto/venv/lib/python3.6/site-packages/django/contrib/admin/templates/admin/change_form.html, error at line 33
__str__ returned non-string (type NoneType)
23  {% endblock %}
24  {% endif %}
25  
26  {% block content %}<div id="content-main">
27  {% block object-tools %}
28  {% if change %}{% if not is_popup %}
29    <ul class="object-tools">
30      {% block object-tools-items %}
31      <li>
32          {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
33          <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
34      </li>
35      {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
36      {% endblock %}
37    </ul>
38  {% endif %}{% endif %}
39  {% endblock %}
40  <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
41  <div>
42  {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
43  {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}

这些是我models.pyadmin.py

的相关部分
class UserContent(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(User, related_name='%(class)s_creator')
    updated_by = models.ForeignKey(User, related_name='%(class)s_updater')

    class Meta:
        abstract = True


class Linetrans(UserContent):
    line = models.ForeignKey(Line)
    translation = models.ForeignKey(Translation)
    text = models.CharField(max_length=400)

    #def __str__(self):
    #    return self.text

    class Meta:
        ordering = ['line']

admin.site.register(Linetrans)

其他模型类非常相似,不会返回错误。当Linetrans作为内联添加到另一个管理类时,也会发生错误。

编辑/更新:我在模型中注释掉了所有其他str()方法,果然错误似乎消失了。现在试图找出问题。

10 个答案:

答案 0 :(得分:29)

事实证明相关模型中存在意外的空CharField。留下这个答案,因为它可能会帮助别人。

通过系统地评论模型的__str__()方法来解决问题,直到找到有问题的模型为止。从那里开始工作以识别违规记录。

答案 1 :(得分:6)

我有类似的问题。问题是一行的主键是null(我不知道是怎么回事)。由于级联问题,我无法删除该行。所以我不得不将 str mmethod更改为这样的事情。

def __str__(self):
    if self.customerName==None:
        return "ERROR-CUSTOMER NAME IS NULL"
    return self.customerName

答案 2 :(得分:2)

对于此错误,您可以使用两种解决方案

第一个解决方案:您可以在代码下方将其注释掉

 def __str__(self):
    return self.id

 #def __str__(self):
 #  return self.id

安全解决方案:您可以从对象返回字符串

 def __str__(self):
    return str(self.id)

答案 3 :(得分:1)

您还可以从Django shell python manage.py shell中删除导致此问题的模型中的实例。当您处理具有许多相关模型(例如我的模型)的模型时,这会有所帮助。

  

通常,此问题是由更改模型字段和   迁移,从而使实例彼此不兼容   和相关字段

答案 4 :(得分:1)

就我而言,我遇到了同样的问题,其根源是:对于__str__函数中使用的字段,数据库中保存了空值。

所以我可以通过以下方式解决问题:

update table
set field_for_STR_use = 'any value'
where field_for_STR_use is null or field_for_STR_use = ''

之后,我只刷新了视图,问题消失了。

答案 5 :(得分:1)

有一个外部引用返回了非字符串字段。我将其更改为字符串字段,也可以更改为str(foreign-key-return-element) 名称= models.CharField(max_length = 200,unique = True)#文章名称 parent = models.ForeignKey('self',on_delete = models.DO_NOTHING,related_name ='category_parent_item',default = None,null = True)#存储子项 created_at = models.DateTimeField(auto_now = True)#创建日期 Updated_at = models.DateTimeField(auto_now = True)#更新日期 用户=模型。ForeignKey(get_user_model(),

on_delete = models.DO_NOTHING,related_name ='category_update_user',默认=无,null = True)#更新文章的用户

def __str__(self):
    return self.name ----------> this was an integer field initially in foreign reference

答案 6 :(得分:0)

def __str__(self):
        return str(self.topic)

使用str使其键入字符串。 那不是非字符串类型。

答案 7 :(得分:0)

查看您在

中引用的班级
        models.ForeignKey 

问题出在

        __str__() 
这些类之一的

方法。 然后,添加

                             or ''

在此类的return语句中。

        def __str__(self):
            return self.title or ''

答案 8 :(得分:0)

在我的情况下,我有另一个模型,该模型被另一个具有VSCode默认片段的模型调用:

def __str__(self):
    return

这导致了错误,即使它在日志中显示了另一个位置。

答案 9 :(得分:0)

如果您尝试使用__str__()返回ForeignKeyOneToOneField的值,则会返回错误

示例:

def __str__():
    return self.user  # where user is a key to other model class

应该是:

def __str__():
    return self.user.__str__() 
    # Or basically any other way that would explicitly unbox the value inside the related model class.