2010-05-30 41 views
3

我试图初始化实例方法中的MyModelAdmin类的窗体属性的内部,具体如下:传递会话数据的ModelForm的ModelAdmin

class MyModelAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     MyModelAdmin.form = MyModelForm(request.user) 

我的目标是定制基于的MyModelForm编辑表单当前会话。然而,当我尝试这个时,我总是收到一个错误(如下所示)。这是将会话数据传递给ModelForm的适当位置吗?如果是这样,那么可能会导致这个错误?

类型错误在...

异常类型:类型错误

异常值:issubclass()ARG 1必须是类

异常位置:/ usr/lib中/ pymodules/python2 .0/django/forms/models.py在,行185

回答

0

我使用queryset fot过滤记录,也许这个例子帮助你:

..... 
..... 
def queryset(self, request): 
    cuser = User.objects.get(username=request.user) 

    qs = self.model._default_manager.get_query_set() 
    ordering = self.ordering or() # otherwise we might try to *None, which is bad ;) 

    if ordering: 
     qs = qs.order_by(*ordering) 

    qs = qs.filter(creator=cuser.id) 

    return qs 
1

从理论上说,你可以重写的ModelAdmin的get_form方法:

# In django.contrib.admin.options.py 
def get_form(self, request, obj=None, **kwargs): 
    """ 
    Returns a Form class for use in the admin add view. This is used by 
    add_view and change_view. 
    """ 
    if self.declared_fieldsets: 
     fields = flatten_fieldsets(self.declared_fieldsets) 
    else: 
     fields = None 
    if self.exclude is None: 
     exclude = [] 
    else: 
     exclude = list(self.exclude) 
    exclude.extend(kwargs.get("exclude", [])) 
    exclude.extend(self.get_readonly_fields(request, obj)) 
    # if exclude is an empty list we pass None to be consistant with the 
    # default on modelform_factory 
    exclude = exclude or None 
    defaults = { 
     "form": self.form, 
     "fields": fields, 
     "exclude": exclude, 
     "formfield_callback": curry(self.formfield_for_dbfield, request=request), 
    } 
    defaults.update(kwargs) 
    return modelform_factory(self.model, **defaults) 

注意它返回一个表单类,而不是一种形式的实例。

1

如果一些新手,而我自己,经过这里:
我不得不定义:

class XForm(forms.ModelForm):  
    request=None  

然后在以前的帖子

mfc=modelform_factory(self.model, **defaults) 
    self.form.request=request #THE IMPORTANT statement 
    return mfc 
1

Izz ad-Din Ruhulessin's answer结合的好点子结束suggestion by Cikić Nenad,我结束了一个非常真棒和简洁的解决方案如下:

class CustomModelAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     self.form.request = request #so we can filter based on logged in user for example 
     return super(CustomModelAdmin, self).get_form(request,**kwargs) 

然后,只需设置一个自定义窗体对于喜欢的ModelAdmin:

form = CustomAdminForm 

而且在像自定义的ModelForm类访问请求:

self.request获取#do与请求的东西与表单关联

+0

我不会在一个线程可以被多个用户使用的生产环境中执行此操作。你基本上在表单Class上设置了一个“请求”变量,这个变量可能在多个用户中共享。并发问题可能会出现。在那里,这样做,不建议 - 这种错误是一个屁股跟踪疼痛。 – 2014-10-24 11:38:45

0

这里是从nemesisfixx溶液生产/线程安全变化:

def get_form(self, request, obj=None, **kwargs): 
    class NewForm(self.form): 
     request = request 
    return super(UserAdmin, self).get_form(request, form=NewForm, **kwargs)