根据 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 发送不同的错误的主要内容,如果未能解决你的问题,请参考以下文章