首页 > 解决方案 > 如何从 save_formset 访问 Django 模型字段

问题描述

我在 Django 模型管理员中有一个内联模型,我需要在保存项目之前创建一个条件,这是正在使用的代码:

class PRCItemInline(admin.TabularInline):


    def get_form(self, request, obj=None, **kwargs):
        form = super(PRCItemInline, self).get_form(request, obj, **kwargs)
        form.base_fields['product'].widget.attrs['style'] = 'width: 50px;'
        return form

    ordering = ['id']
    model = PRCItem
    extra = 1
    autocomplete_fields = [
        'product',
        'supplier',
    ]

    fields = (
        'product',  # 1
        'quantity',  # 2
        'unitary_value_reais_updated',  # 4
        'issuing_status',
        'approval_status',
        'receiving_status',
    )
    readonly_fields = ['issuing_status',
                       'approval_status',
                       'receiving_status',
                       ]

    def save_formset(self, request, form, formset, change):
        obj = form.instance
        if obj.purchase_request.is_analizer:
            return HttpResponse("You can't change this")
        else:
            obj.save()

如您所见,我使用该save_formset方法能够到达模型的字段,然后根据它进行过滤。但无论我添加的 If 语句如何,它都只会保存项目。

标签: pythondjangodjango-modelsdjango-modeladmin

解决方案


第一件事:

列表项save_formset不应返回任何内容,这HttpResponse对您不起作用。即使这样,这也不是正确的方法。更不用说它不会提供很多信息。

第一个解决方案

obj.purchase_request.is_analizer应该在表单验证期间完成

任何ValidationError在那里引发的内容都将传播到表单集并显示在相关表单旁边的错误消息中。

class PRCItemForm(forms.ModelForm):
    def validate(self):
        if obj.purchase_request.is_analizer:
            raise ValidationError("You can't change this")

第二种解决方案

覆盖get_queryset()并过滤掉您无法编辑的对象

def get_queryset(self):
    qs = super().get_queryset()
    return qs.exclude(purchase_request__is_analizer=True)

推荐阅读