簡體   English   中英

如何從 save_formset 訪問 Django Model 字段

[英]How to access Django Model Fields from save_formset

我在 Django model 管理員中有一個內聯 Model,我需要在保存項目之前創建一個條件,這是正在使用的代碼:

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方法能夠到達model的字段,然后根據它進行過濾。 但無論我添加的 If 語句如何,它都只會保存項目。

第一件事:

列表項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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM