Django管理问题-';非类型';对象没有属性';用户';
使用Django 1.5编写博客引擎并使用Django管理员。一切都很好,直到我向模型添加了一个ManyToManyField,并将该字段添加到ModelAdmin的字段集,然后我在尝试加载管理页面时开始出现这个神秘的错误:Django管理问题-';非类型';对象没有属性';用户';,django,python-2.7,django-models,django-admin,django-users,Django,Python 2.7,Django Models,Django Admin,Django Users,使用Django 1.5编写博客引擎并使用Django管理员。一切都很好,直到我向模型添加了一个ManyToManyField,并将该字段添加到ModelAdmin的字段集,然后我在尝试加载管理页面时开始出现这个神秘的错误: 'NoneType' object has no attribute 'user' (下面是完整的堆栈跟踪。)为什么响应对象突然变为无?如果我从字段集中删除字段,一切都会恢复正常 我的模型看起来有点像这样(删除了很多字段): ModelAdmin看起来有点像这样: cla
'NoneType' object has no attribute 'user'
(下面是完整的堆栈跟踪。)为什么响应对象突然变为无?如果我从字段集中删除字段,一切都会恢复正常
我的模型看起来有点像这样(删除了很多字段):
ModelAdmin看起来有点像这样:
class PostAdmin(admin.ModelAdmin):
# Order
fieldsets = (
('Content', {
'fields': ('title', 'tags')
}),
)
def formfield_for_dbfield(self, db_field, request, **kwargs):
# Pre-fill 'author' with logged in name
if db_field.name == "author":
kwargs['initial'] = "%s %s" % (request.user.first_name, request.user.last_name)
return db_field.formfield(**kwargs)
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
当我从字段集中删除“标记”时,一切又恢复了正常。这可能是因为我犯了一些简单的Django管理错误,我以前很少使用它,但我能找到的最好的谷歌搜索是一些三年前修复的错误,我确信我正在运行1.5.1
以下是完整的堆栈跟踪:
Internal Server Error: /theadmin/blog/post/1/
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 115, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py", line 372, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py", line 91, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\decorators\cache.py", line 89, in _wrapped_view_
unc
response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\sites.py", line 202, in inner
return view(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py", line 25, in _wrapper
return bound_func(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py", line 91, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\utils\decorators.py", line 21, in bound_func
return func(self, *args2, **kwargs2)
File "C:\Python27\lib\site-packages\django\db\transaction.py", line 223, in inner
return func(*args, **kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py", line 1081, in change_view
ModelForm = self.get_form(request, obj)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py", line 465, in get_form
return modelform_factory(self.model, **defaults)
File "C:\Python27\lib\site-packages\django\forms\models.py", line 424, in modelform_factory
return type(form)(class_name, (form,), form_class_attrs)
File "C:\Python27\lib\site-packages\django\forms\models.py", line 212, in __new__
opts.exclude, opts.widgets, formfield_callback)
File "C:\Python27\lib\site-packages\django\forms\models.py", line 170, in fields_for_model
formfield = formfield_callback(f, **kwargs)
File "E:\Dropbox\PassionateAbout\PassionateAboutJustice\blog\admin.py", line 35, in formfield_for
dbfield
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py", line 125, in formfield_for_
bfield
related_modeladmin.has_add_permission(request))
File "C:\Python27\lib\site-packages\django\contrib\admin\options.py", line 284, in has_add_permis
ion
return request.user.has_perm(opts.app_label + '.' + opts.get_add_permission())
AttributeError: 'NoneType' object has no attribute 'user'
你拒绝了这个请求。给你:
def formfield_for_dbfield(self, db_field, request, **kwargs):
但你不能把它传下去:
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
然而,原文—
定义如下:
def formfield_for_dbfield(self, db_field, **kwargs):
因此,在重写时应该保留相同的签名。
请注意:原件将用于:
request = kwargs.pop("request", None)
如果要访问该请求,请不要这样做,因为“pop()”将从kwargs中删除该请求。仅访问而不删除:
request = kwargs['request']
因此,您的超级呼叫仍然会传递请求
它只出现在M2M字段中,因为它需要请求来查找当前用户的权限(对于相关模型),而CharField实际上不需要请求,所以不介意它没有。(如果找不到请求,上面的pop()调用将执行此操作)
最终结果:
def formfield_for_dbfield(self, db_field, **kwargs):
# Pre-fill 'author' with logged in name
if db_field.name == "author":
request = kwargs['request']
kwargs['initial'] = "%s %s" % (request.user.first_name, request.user.last_name)
return db_field.formfield(**kwargs)
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
你拒绝了这个请求。给你:
def formfield_for_dbfield(self, db_field, request, **kwargs):
但你不能把它传下去:
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
然而,原文—
定义如下:
def formfield_for_dbfield(self, db_field, **kwargs):
因此,在重写时应该保留相同的签名。
请注意:原件将用于:
request = kwargs.pop("request", None)
如果要访问该请求,请不要这样做,因为“pop()”将从kwargs中删除该请求。仅访问而不删除:
request = kwargs['request']
因此,您的超级呼叫仍然会传递请求
它只出现在M2M字段中,因为它需要请求来查找当前用户的权限(对于相关模型),而CharField实际上不需要请求,所以不介意它没有。(如果找不到请求,上面的pop()调用将执行此操作)
最终结果:
def formfield_for_dbfield(self, db_field, **kwargs):
# Pre-fill 'author' with logged in name
if db_field.name == "author":
request = kwargs['request']
kwargs['initial'] = "%s %s" % (request.user.first_name, request.user.last_name)
return db_field.formfield(**kwargs)
return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs)
文件“E:\Dropbox\PassionateAbout\PassionateAboutJustice\blog\admin.py”,第35行,在formfield\u for dbfield中:您是否重写了此方法?是的,我忽略了该代码,因为它以前工作正常,但我在堆栈跟踪中遗漏了它。我已经编辑了我的文章,将其包括在内。文件“E:\Dropbox\PassionateAbout\PassionateAboutJustice\blog\admin.py”,第35行,在formfield\u for dbfield中:是否覆盖了此方法?是的,我忽略了该代码,因为它以前工作正常,但我在堆栈跟踪中遗漏了它。我已经编辑了我的文章,将其包括在内。