2012-05-17 1 views
0

사용자가 몇 가지 규칙으로 데이터베이스를 채울 수있는 관리자 패널을 작성하려고합니다. 모든 사용자는 특정 엔티티/모델에 대해 자신의 데이터 만보고 편집 할 수 있습니다.django 1.2 modelAdmin 상속 된 클래스, 오류 "get_form()은 3 개의 인수 (2 개가 주어진다)"

나는 어쩌면 바보 같은 문제가 내가이 오류

Environment: 

Request Method: GET 
Request URL: http://127.0.0.1:8000/admin/prodotti/varianti/add/ 
Django Version: 1.2.3 
Python Version: 2.6.6 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'prodotti', 
'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/lib/pymodules/python2.6/django/core/handlers/base.py" in get_response 
    100.      response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/lib/pymodules/python2.6/django/contrib/admin/options.py" in wrapper 
    265.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/utils/decorators.py" in _wrapped_view 
    76.      response = view_func(request, *args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/views/decorators/cache.py" in _wrapped_view_func 
    69.   response = view_func(request, *args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/contrib/admin/sites.py" in inner 
    190.    return view(request, *args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/utils/decorators.py" in _wrapper 
    21.    return decorator(bound_func)(*args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/utils/decorators.py" in _wrapped_view 
    76.      response = view_func(request, *args, **kwargs) 
File "/usr/lib/pymodules/python2.6/django/utils/decorators.py" in bound_func 
    17.     return func(self, *args2, **kwargs2) 
File "/usr/lib/pymodules/python2.6/django/db/transaction.py" in _commit_on_success 
    299.      res = func(*args, **kw) 
File "/usr/lib/pymodules/python2.6/django/contrib/admin/options.py" in add_view 
    799.   ModelForm = self.get_form(request) 

Exception Type: TypeError at /admin/prodotti/varianti/add/ 
Exception Value: get_form() takes exactly 3 arguments (2 given) 

을 얻을 변형을 추가하기 위해 노력하고있어이 방법

#my models 

class Product(models.Model): 
    name = models.CharField(max_length=80) 
    description = models.TextField() 
    author = models.ForeignKey(User) 

    def __unicode__(self): 
     return self.name 

class Variant(models.Model): 
    size = models.DecimalField(max_digits=3, decimal_places=0) 
    author = models.ForeignKey(User) 
    super_product = models.ForeignKey(Product) 

    def __unicode__(self): 
     return "%s %s" % (self.size) 

#in urls.py 

class FilterProduct(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(FilterProduct, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(author=request.user) 

    def save_model(self, request, obj, form, change): 
     if not request.user.is_superuser: 
      obj.author = request.user 

     obj.save() 

class FilterVariant(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(FilterVariant, self).queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(author=request.user) 

    def save_model(self, request, obj, form, change): 
     if not request.user.is_superuser: 
      obj.author = request.user 

     obj.save() 

    def get_form(self, request, obj, **kwargs): 
     form = super(FilerVariant,self).get_form(self,request, obj,**kwargs) 

     if not request.user.is_superuser: 
      form.base_fields['super_product'].queryset = form.base_fields['super_product'].queryset.filter(author=request.user) 

     return form 

admin.site.register(Product,FilterProduct) 
admin.site.register(Variant,FilterVariant) 

에 modelAdmin 클래스를 상속하고있어이 작업을 수행하기위한, 실수는 어디 있습니까? 함수에 필요한 매개 변수를 모두 제공합니까?

답변

1

여기에 몇 가지 오류가 있습니다.

는 첫째, get_form 방법의 원본 서명이 def get_form(self, request, obj=None, **kwargs)이다 - 즉, obj 인수는 선택 사항입니다 (의미가있는 새 항목을 만들 때와 같이, 기존의 객체가 없다). 그러나 이것을 def get_form(self, request, obj, **kwargs)으로 재정의했습니다. 즉, 이제는 obj 인수가 필요합니다.

관리자가 완료했기 때문에 메소드를 호출하는 방법을 완전히 제어하지 않는 한 -이 경우 사용자가 메소드를 원본과 동일한 인수로 받아 들일 수 있는지 확인해야합니다. 아주 최소한.

두 번째 오류는 다음 줄에있다 : 당신이 self 인수를 복제 한 다음

form = super(FilerVariant,self).get_form(self,request, obj,**kwargs) 

- 이미 첫 번째 인수로 전달 된 것 같이 당신은 메서드 호출에 명시 적으로 전달할 수 없습니다.

마지막으로, Django 1.2는 2 년 전에 릴리스되었습니다. 그 이후로 많은 변화가있었습니다.

+0

많은 감사. 어쨌든 새로운 버전이 더 좋지만 서버에 설치된 소프트웨어를 변경할 수 없다는 것을 알고 있습니다. :) – Infrid

관련 문제