【问题标题】:Error in Django Admin Site during template rendering- '__str__ returned non-string (type bytes)'模板渲染期间 Django 管理站点出错-'__str__ 返回非字符串(类型字节)'
【发布时间】:2018-08-21 14:20:08
【问题描述】:

我想在我的 Django 应用程序的管理面板中访问模型-http://127.0.0.1:8000/admin/scraper/ad_history/

当我单击模型链接查看其条目时,我收到以下错误:

TypeError at /admin/scraper/ad_history/
__str__ returned non-string (type bytes)
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/scraper/ad_history/
Django Version: 2.1
Exception Type: TypeError
Exception Value:    
__str__ returned non-string (type bytes)
Exception Location: C:\Python36-32\lib\site-packages\django\contrib\admin\templatetags\admin_list.py in items_for_result, line 251
Python Executable:  C:\Python36-32\Anaconda\python.exe
Python Version: 3.6.5
Python Path:    
['C:\\MyApp\\MyApp',
 'C:\\Python36-32\\python36.zip',
 'C:\\Python36-32\\DLLs',
 'C:\\Python36-32\\lib',
 'C:\\Python36-32',
 'C:\\Python36-32\\lib\\site-packages',
 'C:\\Python36-32\\lib\\site-packages\\win32',
 'C:\\Python36-32\\lib\\site-packages\\win32\\lib',
 'C:\\Python36-32\\lib\\site-packages\\Pythonwin']
Server time:    Tue, 21 Aug 2018 14:05:36 +0000

__str__ returned non-string (type bytes)

广告历史模型:

class Ad_History(models.Model):
    ad = models.ForeignKey(Ad, on_delete=models.CASCADE)
    date_found = models.DateTimeField(auto_now_add=True, blank=True)
    keyword = models.ForeignKey(Keyword, null=True, on_delete=models.CASCADE)
    kw_scrape_count = models.IntegerField()
    page_found = models.IntegerField(default=None, null=True)
    sequence = models.IntegerField(default=None, null=True)

    def __str__(self):
        return self.ad.description

Admin.py:

from django.contrib import admin
from .models import Domain, Ad, Phone, Email, Hour, Address, Ad_History 

from scraper.forms import AdHistoryAdmin, AdAdmin, DomainAdmin

# Register your models here.
admin.site.register(Domain, DomainAdmin)
admin.site.register(Phone)
admin.site.register(Email)
admin.site.register(Address)
admin.site.register(Hour)
admin.site.register(Ad, AdAdmin)
admin.site.register(Ad_History, AdHistoryAdmin)

广告历史管理员:

class AdHistoryAdmin(admin.ModelAdmin):
    list_display = ('ad', 'date_found', 'kw_scrape_count', 'keyword', 'sequence')

我尝试更改模型中的 str 函数以返回一个虚拟字符串(以确保没有返回字节),但这仍然产生错误。

有什么办法可以深入了解这个吗?

【问题讨论】:

  • 请显示ad_history模型和模型管理类。
  • 刚刚用 admin.py 更新了,是这个意思吗?丢失的“自我”引用是无意的,发生在我从测试字符串中恢复代码时。
  • 请显示AdHistoryAdmin模型管理员类。
  • list_display 引用了几个不同的模型(例如 ad、keyword),因此问题可能出在其中一个模型的 __str__ 方法上。
  • @Alasdair,谢谢这为我解决了这个问题。问题是我在项目上从 2-3 升级了我的 python 版本,并且我的模型的一些 str 函数正在使用 str.encode('utf-8', errors='replace') .我删除了它,现在它们都可以工作了。

标签: django django-models django-admin python-3.6


【解决方案1】:

我不确定您要向字符串中输入什么,但可以使用非字符串值:

def __str__(self):
   return 'Value1={0}, Value2={1}'.format(self.value1, self.value2)

【讨论】:

  • 即使我返回一个硬编码的字符串,即返回“a string”,我也会遇到同样的错误
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 2020-08-15
  • 2021-02-16
  • 1970-01-01
  • 2017-07-02
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多