【问题标题】:Django: How to clean data when list_editable in admin page?Django:如何在管理页面中的 list_editable 时清理数据?
【发布时间】:2022-07-09 01:19:21
【问题描述】:

我有一个模型,它有一个“关键字”字段。当我使用表单创建/修改记录时,我可以清理该字段然后保存它。

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

但是,当我在管理页面中使用 list_editable 选项时,我不确定如何运行 clean() 来更新数据。

我尝试了类似这样的操作,但收到一条错误消息,提示我无法设置属性。数据清理后更新数据的正确方法是什么?

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)

【问题讨论】:

  • 我建议重用 ILProjectForm 而不是在表单集中复制逻辑。

标签: django


【解决方案1】:

应该是这样的:

class ILProjectAdmin(...)
    ... 
    def get_changelist_form(self, request, **kwargs):
            return ILProjectForm

【讨论】:

    【解决方案2】:

    请参考此提示: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    
    

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2016-01-29
      • 2018-08-03
      • 2011-08-16
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多