Django管理后台:TypeError:__str__返回非字符串(FieldFile类型)

4

我有一个正常运行的Django网站和管理页面,但是当我尝试使用管理页面创建一个“Article”模型的新对象时,会出现以下错误:

TypeError at /admin/blog/article/add/

__str__ returned non-string (type FieldFile)
Exception Type:     TypeError
Exception Value:    __str__ returned non-string (type FieldFile)
Exception Location:     /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/utils/encoding.py in force_text, line 90

奇怪的是:今天早上它还能正常工作。我尝试安装django-markdown,然后开始出现这个错误。我无法解决它,因此我卸载了django-markdown,将所有代码还原到最初的状态(之前是可以运行的),并执行了适当的迁移。

但我仍然得到了这个错误。

以下是跟踪和渲染错误:

Error during template rendering

In template /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
__str__ returned non-string (type FieldFile)
9               {% for field in line %}
10                  <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% 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.help_text %}
23                          <p class="help">{{ field.field.help_text|safe }}</p>
24                      {% endif %}
25                  </div>
26              {% endfor %}
27          </div>
28      {% endfor %}
29  </fieldset>
Traceback Switch to copy-and-paste view

    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/core/handlers/base.py in get_response

                                    response = response.render()

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/response.py in render

                                self.content = self.rendered_content

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/response.py in rendered_content

                            content = template.render(context, self._request)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/backends/django.py in render

                            return self.template.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                        return self._render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in _render

                            return self.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/loader_tags.py in render

                            return compiled_parent._render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in _render

                            return self.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/loader_tags.py in render

                            return compiled_parent._render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in _render

                            return self.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/loader_tags.py in render

                                    result = block.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/loader_tags.py in render

                                    result = block.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/defaulttags.py in render

                                                nodelist.append(node.render(context))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/loader_tags.py in render

                                    return template.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    return self._render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in _render

                            return self.nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/defaulttags.py in render

                                                nodelist.append(node.render(context))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/defaulttags.py in render

                                                nodelist.append(node.render(context))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/defaulttags.py in render

                                    return nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/defaulttags.py in render

                                    return nodelist.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/base.py in render

                                    bit = self.render_node(node, context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render_node

                                return node.render(context)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/template/debug.py in render

                                output = force_text(output)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/utils/encoding.py in force_text

                                        s = six.text_type(s)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/utils/html.py in <lambda>

                            klass.__str__ = lambda self: mark_safe(klass_str(self))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/forms.py in __str__

                            return self.as_widget()

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/forms.py in as_widget

                            return force_text(widget.render(name, self.value(), attrs=attrs))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/contrib/admin/widgets.py in render

                                'widget': self.widget.render(name, value, *args, **kwargs),

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/widgets.py in render

                            options = self.render_options(choices, value)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/widgets.py in render_options

                            for option_value, option_label in chain(self.choices, choices):

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/models.py in __iter__

                                    yield self.choice(obj)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/models.py in choice

                            return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/forms/models.py in label_from_instance

                            return smart_text(obj)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/utils/encoding.py in smart_text

                        return force_text(s, encoding, strings_only, errors)

         ...
    ▶ Local vars
    /home/USERNAME/webapps/APPNAME/lib/python3.4/Django-1.8.2-py3.4.egg/django/utils/encoding.py in force_text

                                        s = six.text_type(s)

         ...
    ▶ Local vars 

这是我的文章模型:

class Article(models.Model):
    author = models.ForeignKey(Author, blank=True, null=True)
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, blank=True, null=True)
    article_category = models.OneToOneField(ArticleCategory, blank=True, null=True)
    body_en = models.TextField(blank=True, null=True)
    body_fr = models.TextField(blank=True, null=True)
    is_review = models.BooleanField(default=False)
    publish = models.BooleanField(default=True)
    date_created = models.DateTimeField(blank=True, null=True)
    modified = models.DateTimeField(auto_now=True)
    tags = models.ManyToManyField(Tag, blank=True, null=True)
    work_link = models.ForeignKey(Work, null=True, blank=True)
    artist_link = models.ForeignKey(Artist, null=True, blank=True)
    images = models.ManyToManyField(ArticleImage)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ["-date_created"]

admin.py:

from django.contrib import admin
from blog.models import Article, Tag, Author, ArticleCategory, ArticleImage

# Register your models here.
admin.site.register(Article)
admin.site.register(Author)
admin.site.register(Tag)
admin.site.register(ArticleCategory)
admin.site.register(ArticleImage)

我几乎想卸载然后用当前的设置重新开始整个过程,但我更希望找出我搞砸了什么并加以修复。
非常感谢任何帮助。
Matt
1个回答

9

如果无法查看本地变量,很难诊断问题。某个模型在为管理界面的小部件提供选项标签时调用时返回了一个FieldFile而不是字符串。

检查您模型中的str方法。其中一个可能有一个FileField字段导致该问题。


但是错误提示说“FieldFile”而不是“FileField”。它们是同一件事吗? - Matt Payne
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - miyamoto
搞定了。这是在我安装django-markdown时遇到bug的时候发生的,所以我把它归因于那个。我将字符串方法更改为图像标题,现在它可以正常工作了。 - Matt Payne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接