根据 url Django 发送不同的错误

Posted

技术标签:

【中文标题】根据 url Django 发送不同的错误【英文标题】:Sending different errors depending on url Django 【发布时间】:2017-10-03 05:50:55 【问题描述】:

我在 Django 中工作,我有一种情况,我编写了一个自定义验证器,它存在于 model.py 中

当输入错误时,这个验证器应该返回一个validationError。

在我正在进行的项目中,我们将 Django Rest Framework 用于我们的 API,将 Django 管理面板用于我们的管理面板。它们连接到同一个数据库

我的问题是,当请求来自 API 时,我需要返回“serializers.ValidationError”(其中包含状态码 400),但是当请求来自管理面板时,我想返回“django” .core.exceptions.ValidationError' 在管理面板上工作。 exceptions.ValidationError 无法在 API 中正确显示,并且 serializers.ValidationError 会导致管理面板中断。有什么方法可以将适当的 ValidationError 发送到适当的地方吗?

这是我的验证函数(它存在于模型中)

 def validate_unique(self, *args, **kwargs):
    super(OrganizationBase, self).validate_unique(*args, **kwargs)
    qs = self.__class__._default_manager.filter(organization_type="MEMBER")
    if not self._state.adding and self.pk is not None:
        qs = qs.exclude(pk=self.pk)
    if qs.exists():
        raise serializers.ValidationError("Only one organization with \'Organization Type\' of \'Member\' is allowed.") #api
        raise exceptions.ValidationError("Only one organization with \'Organization Type\' of \'Member\' is allowed.") #admin

最后两行是为了说明而写在一起的两个错误,在这种情况下只有#api会运行

基本上我想在请求来自管理面板时发送errorA,当请求来自API时发送errorB

谢谢

【问题讨论】:

我不明白 API 和 Django 的管理员是如何关联的。此外,“API 中的 exceptions.ValidationError 没有正确显示”太含糊而无济于事。 它们没有链接,它们只是使用相同的数据库。基本上我想在请求来自管理面板时发送errorA,当请求来自API时发送errorB 【参考方案1】:

为了引发不同的错误类,编写不同的验证器。

rest 框架 api:

您可以使用UniqueValidator 或自定义验证函数。检查链接 [1]

例如:

class MySerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = (....)

    def validate(self, data):
        # my validation code
        raise serializers.ValidationError(....)
        return data

管理面板:

对于管理面板,您可以使用自定义表单 [2]。

例如:

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        # my validation code
        raise exceptions.ValidationError(....)
        return cleaned_data


class MyAdmin(admin.ModelAdmin):
    form = MyForm

在序列化程序和表单中,如果不是没有实例对象,您可以访问实例对象。

[1]http://www.django-rest-framework.org/api-guide/validators/#uniquevalidator

[2]https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

【讨论】:

以上是关于根据 url Django 发送不同的错误的主要内容,如果未能解决你的问题,请参考以下文章

Django:如果 slug 错误,则重定向 url

为每个 url 返回错误(相同)django 模板

Django 在发送 POST 请求时返回 403 错误

Django URL 配置错误

Django的请求生命周期

django中所有URL的编程错误,postgres在db中找不到表?