0

Django 1.5 및 Django Admin을 사용하여 블로그 엔진 작성하기.Django Admin Issue - 'NoneType'객체에 'user'속성이 없습니다.

'NoneType' object has no attribute 'user' 

(전체 스택을 더 추적 : 나는 모델에 ManyToManyField을 추가하고, ModelAdmin의 필드 셋에 해당 필드를 추가 할 때까지 모든 것이 괜찮다고, 그때는 관리자 페이지를로드하려고이 신비 오류가 발생하기 시작 왜 응답 객체가 갑자기 None이 될까요? 필드 집합에서 필드를 제거하면 모든 것이 다시 정상적으로 작동합니다.

class Tag(models.Model): 
    name = models.CharField(max_length=30) 

class Post(models.Model): 
    title = models.CharField(max_length=300) 
    tags = models.ManyToManyField(Tag) 
    author = models.CharField(max_length=100) 

그리고 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) 

을 내가 제거 할 때이 태그의에서 '입니다 모든 것이 잘 돌아가는 필드 세트. 그것은 몇 가지 간단한 장고 관리자 실수하고있어, 전에 많이 사용하지 않은 수 있지만 가장 좋은 내가 찾은 수있는 버그를 3 ​​년 전에 고정 된 버그, 그리고 나는 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' 
+0

__File "E : \ 드롭 박스 \ PassionateAbout \ PassionateAboutJustice 블로그 \의 admin.py \", 라인 (35) in formfield_for dbfield__ :이 방법을 재정의 했습니까? – Ricola3D

+0

예, 이전에 잘 작동 했으므로 그 코드를 생략했지만 스택 추적에서 놓쳤습니다. 내가 포함하도록 내 게시물을 편집했습니다. – DizzyDoo

답변

2

.

def formfield_for_dbfield(self, db_field, request, **kwargs): 

을하지만 당신은 그것을 통과하지 : 여기 당신은 그것을 가지고

return super(PostAdmin, self).formfield_for_dbfield(db_field, **kwargs) 

원래 그러나 - https://github.com/django/django/blob/stable/1.5.x/django/contrib/admin/options.py#L88 는 다음과 같이 정의된다 :

def formfield_for_dbfield(self, db_field, **kwargs): 

그래서 당신은 유지해야 재정의 할 때 동일한 서명. 참고 : 원래 할 것 :

request = kwargs.pop("request", None) 

당신이 요청에 액세스하려면이, 동일한 작업을 수행하지 않습니다, 때문에 "팝업()"kwargs로에서 제거됩니다. 그냥 삭제하지 않고 액세스 :

request = kwargs['request'] 

그래서 당신의 슈퍼 호출이 여전히 통해 요청을 전달합니다.

CharField가 실제로 요청을 필요로하지 않는 반면 (관련 모델의 경우) 현재 사용자의 사용 권한을 조회하는 요청이 필요하기 때문에 M2M 필드에서만 표시됩니다. 따라서 아무 것도 없음 .

최종 결과를 (요청이 발견되지 않는 경우 위의 팝업()를 호출 할 것이다) :

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)