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
#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_formmethod isdef get_form(self, request, obj=None, **kwargs)– that is, theobjargument is optional (which makes sense, as when you’re creating a new item, there is no existing object). However, you’ve overridden it with this:def get_form(self, request, obj, **kwargs)– ie now theobjargument is required.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:
Here you’ve duplicated the
selfargument – you mustn’t pass it explicitly in the method call, as it’s already passed as the first argument.Finally, you should definitely think about upgrading – Django 1.2 was released two years ago, there’s been a lot of changes since then.