Passing session data to ModelForm inside ModelAdmin

I am trying to initialize a form attribute for the MyModelAdmin class inside an instance method as follows:

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

My goal is to customize the editing form MyModelFormbased on the current session. However, when I try to do this, I still get an error message (shown below). Is this a good place to transfer session data to ModelForm? If so, what could be causing this error?

TypeError at ...

Exception Type: TypeError

Exception value: issubclass () arg 1 must be a class

Exclusion location: /usr/lib/pymodules/python2.6/django/forms/models.py in the new , line 185

+3
source share
5

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 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 - ,

+1

I am using request filtering filter files, maybe this example will help you:

.....
.....
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
0
source

Here is the production / thread safety solution of 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)
0
source

Source: https://habr.com/ru/post/1747758/


All Articles