1

I have a model which has a field 'keywords'. When I use a form to create/modify records, I am able to clean this field and then save it.

class ILProjectForm(forms.ModelForm):

    class Meta:
        models = ILProject
        fields = '__all__'


    def clean_keywords(self):
        k = self.cleaned_data.get('keywords')
        if k:
            k = ','.join([a.strip() for a in re.sub('\\s+', ' ', k).strip().split(',')])
        return k

However, I am not sure how to run clean() to update the data when I am using the list_editable option in the admin page.

I tried something like this bit I get an error saying I cannot set an attribute. What is the correct way to update the data after it has been cleaned?

class MyAdminFormSet(BaseModelFormSet):

    def clean(self):
        print(type(self.cleaned_data))
        recs = []
        for r in self.cleaned_data:
            if r['keywords']:
                r['keywords'] = ','.join([a.strip() for a in re.sub('\\s+', ' ', r['keywords']).strip().split(',')])
                print(r['keywords'])
            recs.append(r)
        self.cleaned_data = recs      <-- this part is problematic.

class ILProjectAdmin(...)
...
        def get_changelist_formset(self, request, **kwargs):
            kwargs['formset'] = MyAdminFormSet
            return super().get_changelist_formset(request, **kwargs)
user4979733
  • 3,181
  • 4
  • 26
  • 41

2 Answers2

2

It should be like this:

class ILProjectAdmin(...)
    ... 
    def get_changelist_form(self, request, **kwargs):
            return ILProjectForm
user4979733
  • 3,181
  • 4
  • 26
  • 41
0

Please refer this tip: Django: Access request object from admin's form.clean()

class ProjectRequestForm(forms.ModelForm):
    class Meta:
        model = ProjectRequest

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(ProjectRequestForm, self).__init__(*args, **kwargs)
        
    def clean(self):
        if self.request.user.has_perm('access_role'):
            raise ValidationError(f'No permission', code='invalid')


class ProjectRequestAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        form = super(ProjectRequestAdmin, self).get_form(request, obj, **kwargs)

            class AdminFormWithRequest(form):
                def __new__(cls, *args, **kwargs):
                    kwargs['request'] = request
                    return form(*args, **kwargs)            
        return AdminFormWithRequest

    def get_changelist_form(self, request, **kwargs):
        class AdminFormWithRequest(ProjectRequestForm):
            def __new__(cls, *args, **kwargs):
                kwargs['request'] = request
                return ProjectRequestForm(*args, **kwargs)            
        return AdminFormWithRequest    
AndyC
  • 109
  • 2
  • 4