Как получить доступ к полям модели Django из save_formset - PullRequest
2 голосов
/ 06 ноября 2019

У меня есть встроенная модель в админке модели 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.

1 Ответ

1 голос
/ 07 ноября 2019

Первым делом:

Элемент списка save_formset не должен ничего возвращать, HttpResponse не будет работать для вас. Даже если бы это было просто неправильно. Не говоря уже о том, что это не будет очень информативно.

1-е решение

obj.purchase_request.is_analizer должно быть сделано во время проверки формы

Любой ValidationError поднятый там будет распространен наFormset и отображается в сообщении об ошибке рядом с соответствующей формой.

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

2-е решение

переопределить get_queryset() и отфильтровать объекты, которые вы не можете редактировать

def get_queryset(self):
    qs = super().get_queryset()
    return <b>qs.exclude(purchase_request__is_analizer=True)</b>
...