簡體   English   中英

Django pre_save 信號和 ModelAdmin 自定義錯誤消息

[英]Django pre_save signal and ModelAdmin custom error message

我有一個模型,其 pre_save() 信號通過以下方式連接到刪除服務(json、REST 等):

  1. 本地保存前,查詢遠程服務,請求遠程插入
  2. 遠程服務做它的事情,主要是檢查相關條目是否已經存在。
  3. 成功時(HTTP 201),一切都很好,本地模型使用遠程服務響應來填充數據庫。
  4. 失敗時,服務返回 HTTP 400(狀態碼是有爭議的,但這是針對 SO 上的另一個問題 :-))
  5. 錯誤響應格式如下:

    {'local_model_field': [u'This element already exists']}

  6. 本地模型 pre_save 信號然后引發ValidationError

    raise ValidationError(json_response['local_model_field'][0])

這很好用。

現在,在 django 管理員上,當我嘗試模擬遠程插入一個已經存在的對象時,我得到一個 500 頁,這很好但並不理想。

有沒有辦法讓 pre_save() 錯誤氣泡一直到ModelAdmin並顯示為標准錯誤消息,並填充相關內容?

我嘗試了以下但無濟於事:

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    """
    trying to display the right message when pre_save() fails on model save() method (after asking CC)
    """
    try:
        return super(ObjectAdmin, self).changeform_view(request, object_id, form_url, extra_context)
    except IntegrityError as e:
        self.message_user(request, e, level=messages.ERROR)
        return HttpResponseRedirect(form_url)

ValidationError是正確的做法嗎? 知道pre_save()必須鎖定任何以本地和遠程重復結尾的機會。 主要原因是本地/遠程對象創建可以由管理員進行,也可以從其他網站實例/類型(例如,前端、面向最終用戶)進行。

謝謝

不確定這是否仍然相關。 但我解決這個問題的方法是創建一個 ModelForm:

class AuthorAdminForm(forms.ModelForm):

    def clean(self):
        # or some api calls here
        if self.instance.id > 4:
            self.instance.name = "4+"
        else:
            ValidationError("Id is bigger that 4")
        return super().clean()

然后通過將表單添加到管理模型:

class AuthorAdmin(admin.ModelAdmin):
    form = AuthorAdminForm

這個clean()方法將確保您可以在點擊模型save()方法之前添加/修改字段,並且如果在點擊 url 時出現404錯誤等問題,仍然會拋出ValidationError

暫無
暫無

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

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