简体   繁体   English

django 1.2 modelAdmin继承的类,错误“ get_form()恰好接受3个参数(给定2个)”

[英]django 1.2 modelAdmin inherited class, error “get_form() takes exactly 3 arguments (2 given)”

I'm trying to build an admin panel where users can populate the database with some rules; 我正在尝试构建一个管理面板,用户可以在其中使用一些规则填充数据库; every user can see and edit, for certain entity/models, only own data. 对于某些实体/模型,每个用户只能看到和编辑自己的数据。

for do this I'm inheriting a modelAdmin class in this way 为此,我以这种方式继承了modelAdmin类

#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)

when I'm trying to add a Variant I get this error 当我尝试添加变体时出现此错误

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)

maybe is a stupid problem, where is the mistake? 也许是一个愚蠢的问题,错误在哪里? Am I giving to the function all the needing parameters? 我是否给该功能所有需要的参数?

There are a couple of errors here. 这里有几个错误。

Firstly, the original signature of the get_form method is def get_form(self, request, obj=None, **kwargs) - that is, the obj argument is optional (which makes sense, as when you're creating a new item, there is no existing object). 首先, get_form方法的原始签名是def get_form(self, request, obj=None, **kwargs) -也就是说, obj参数是可选的(这很有意义,就像在创建新项时一样)是不存在的对象)。 However, you've overridden it with this: def get_form(self, request, obj, **kwargs) - ie now the obj argument is required. 但是,您已经用以下方法覆盖了它: def get_form(self, request, obj, **kwargs) -即现在需要obj参数。

Unless you have complete control over how your method is going to be called - which you don't in this case, because it's done by the admin - you should ensure that your method can accept the same arguments as the original, at the very least. 除非您完全控制方法的调用方式(在这种情况下您不会这样做,因为它是由管理员完成的),否则,应确保您的方法至少可以接受与原始方法相同的参数。

Your second error is in the next line: 您的第二个错误是在下一行:

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

Here you've duplicated the self argument - you mustn't pass it explicitly in the method call, as it's already passed as the first argument. 在这里,您已经复制了self参数-您不能在方法调用中显式传递它,因为它已经作为第一个参数传递了。

Finally, you should definitely think about upgrading - Django 1.2 was released two years ago, there's been a lot of changes since then. 最后,您绝对应该考虑升级-两年前发布Django 1.2,此后发生了很多变化。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM