预期一个字符缓冲对象。

4

这篇文章中的模型。在admin.py中:

class GroupsAdmin(admin.ModelAdmin):

    fieldsets = [
        (None,               {'fields': ['first_year', 'many other']}),

    ]

所以,在这个管理区域,我可以将first_year添加到特殊系列的汽车中。我按下“+”然后打开一个新窗口 - 在那里我可以添加年份。我添加了'2011',按下“保存”并看到错误:

TypeError: expected a character buffer object.

这很奇怪,因为上周它还能正常工作。如何修复?如果我进入first_yearAdmin并添加年份,则可以正常工作而无需出现错误。

谢谢。

编辑。回溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/admin/cars/first_year/add/?_popup=1

Django Version: 1.5
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sitemaps',
 'cars',
 'django_evolution',
 'django.contrib.admin')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py" in wrapper
  372.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
  89.         response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/sites.py" in inner
  202.             return view(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapper
  25.             return bound_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view
  91.                     response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in bound_func
  21.                 return func(self, *args2, **kwargs2)
File "/usr/local/lib/python2.7/dist-packages/django/db/transaction.py" in inner
  223.                 return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py" in add_view
  1010.                 return self.response_add(request, new_object)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/options.py" in response_add
  833.                 (escape(pk_value), escapejs(obj)))
File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py" in wrapper
  194.             return func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/utils/html.py" in escapejs
  65.     return mark_safe(force_text(value).translate(_js_escapes))

Exception Type: TypeError at /admin/cars/first_year/add/
Exception Value: expected a character buffer object

模型

class Mark(models.Model):
    many_many_char_fields
    def __unicode__(self):
        return self.name

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)

class Groups(models.Model):
        many_other_fields
    mark = models.ForeignKey(Mark, related_name='groups')
    last_update = models.DateTimeField()
    first_year = models.ForeignKey(First_Year, related_name='first_year')
    def __unicode__(self):
        return self.name
    def altered_date(self, year):
        altered_year = int(year)-int(self.first_year.year)
        return altered_year

年份 = models.IntegerField(max_digits=4) - catherine
TypeError: __init__() got an unexpected keyword argument 'max_digits' - Leon
1
@tim 好的,我想我知道你问题的原因了,希望是这样。在你的 First_Year 模型中,你只有一个使用 IntegerField 的字段,而 Django 不允许在 unicode 中返回它。TypeError 字符缓冲区来自于你的 str。所以尝试将该字段更改为 CharField,删除你的数据库并重新同步。 - catherine
1
year = models.CharField(max_length=4),要检查年份是否为CharField,请转到您的数据库。 - catherine
@catherine 我已经按照你说的做了所有的事情,加上了 return self.year,它起作用了!非常感谢你,太棒了! - Leon
显示剩余11条评论
3个回答

9
实际上,并不需要将“年份”字段转换为Charfield,如果您想保持它的整数形式,在许多情况下需要数字是不可能的。解决这个1.5版本的问题的方法是使__unicode__函数返回unicode字符串:
class First_Year(models.Model):
    year = models.IntegerField()

    def __unicode__(self):
        return unicode(self.year)

2
class First_Year(models.Model):
    year = models.CharField(max_length=4)
    def __unicode__(self):
        return self.year

0

你忘记了这个

class GroupsAdmin(admin.ModelAdmin):
    model = Groups

我不确定,但我认为字段键必须接收一个列表的列表或元组的列表,所以你需要这样做:{'fields': ['first_year', 'many other'],}在字典后面加上逗号。 - Fernando Freitas Alves

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