0

ユーザーがデータベースにいくつかのルールを入力できる管理パネルを構築しようとしています。特定のエンティティ/モデルについては、すべてのユーザーが自分のデータのみを表示および編集できます。

これを行うために、この方法で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)

バリアントを追加しようとすると、このエラーが発生します

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)

たぶんばかげた問題です、どこが間違っていますか?必要なすべてのパラメーターを関数に与えていますか?

4

1 に答える 1

1

ここにはいくつかのエラーがあります。

まず、get_formメソッドの元の署名はdef get_form(self, request, obj=None, **kwargs)- つまり、obj引数はオプションです (これは、新しいアイテムを作成するときに既存のオブジェクトが存在しないため、理にかなっています)。ただし、これをオーバーライドしました: def get_form(self, request, obj, **kwargs)- つまり、obj引数が必要になりました。

メソッドがどのように呼び出されるかを完全に制御できない限り (この場合は管理者によって行われるため制御できません)、少なくともメソッドが元の引数と同じ引数を受け入れることができるようにする必要があります。 .

2 番目のエラーは次の行にあります。

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

ここでは、引数を複製してselfいます。最初の引数として既に渡されているため、メソッド呼び出しで明示的に渡してはなりません。

最後に、アップグレードを検討する必要があります。Django 1.2 は 2 年前にリリースされました。それ以来、多くの変更が行われています。

于 2012-05-17T09:47:29.060 に答える