Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django Rest框架如何在models.CharField上设置错误消息 你好 总结问题_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django Rest框架如何在models.CharField上设置错误消息 你好 总结问题

Python Django Rest框架如何在models.CharField上设置错误消息 你好 总结问题,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个Django Rest Framework后端,我想在其上做一件简单的事情: 更改: 像这样的习惯 'max_length': 'I am happy to see you {max_length}.' 失败的方法在这篇文章的底部 最简单的例子: 您可以从中提取一个最小的示例,并通过调用来运行测试 从django.contrib.auth.models导入( 抽象用户, 许可证, ) 从django.db导入模型 从rest_框架导入序列化程序 类用户(AbstractBaseUser

我有一个Django Rest Framework后端,我想在其上做一件简单的事情: 更改:

像这样的习惯

'max_length': 'I am happy to see you {max_length}.'
失败的方法在这篇文章的底部

最简单的例子: 您可以从中提取一个最小的示例,并通过调用来运行测试

从django.contrib.auth.models导入(
抽象用户,
许可证,
)
从django.db导入模型
从rest_框架导入序列化程序
类用户(AbstractBaseUser,PermissionsMixin):
name=models.CharField(“name”,最大长度=42,null=True,
error_messages={'max_length':“我很高兴见到你{max_length}。”)
类UserSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=[“名称”]
额外费用={
“name”:{“required”:True,“allow_blank”:False,“allow_null”:False},
}
类TestUserSerializer:
def test_name()->无:
数据={
“名称”:“A”*43,
}
序列化程序=用户序列化程序(数据=数据)
assert serializer.is_valid()为False
assert str(serializer.errors[“name”][0])==“很高兴见到您。”
错误消息似乎被忽略

失败的内容:
  • ()
    error\u messages
    作为CharField参数(如示例所示)
  • ()基于,我尝试为CharField设置validatior参数,如:
    validators=[MaxLengthValidator(42,message=“我很高兴见到你{max_length}”)]
  • (实验)基于一个实例,我尝试添加一个定制的
    CharField
    类。也许我不理解他们的解决方案,因为继承自
    字段。CharField
    不允许我在init方法中设置内容(我使用
    模型。CharField
    ,他们使用
    字段。CharField
    。这两种方法都不起作用
  • 基于这一点,我开始怀疑这是否可行
  • ()编写自定义验证方法
    def validate\u name(self,value):
    内部
    UserSerializer
    。它也被忽略

请在提交消息中自由查看git am的解释

还修复了值的显示,并添加了一个测试,以确保替代在模型级别工作

From b5e0b90d8aea9348ef0de7624ad1460c06a2c44e Mon Sep 17 00:00:00 2001
From: Melvyn <melvyn@stackexchange.site>
Date: Sat, 20 Mar 2021 00:30:29 +0100
Subject: [PATCH] fix(main): Add error_messages to serializer

Apparently the ModelSerializer doesn't copy the error_messages attribute
from the model field, so we have to do that by hand.
---
 stack_example/tests/test_user.py  | 9 +++++++++
 stack_example/user/models.py      | 2 +-
 stack_example/user/serializers.py | 5 ++---
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/stack_example/tests/test_user.py b/stack_example/tests/test_user.py
index 5aeba74..8493dc1 100644
--- a/stack_example/tests/test_user.py
+++ b/stack_example/tests/test_user.py
@@ -1,5 +1,14 @@
 import pytest
 from user.serializers import UserSerializer
+from user.models import User
+from django.core.exceptions import ValidationError
+
+def test_model():
+    user = User(name="A" * 43)
+    try:
+        user.clean_fields()
+    except ValidationError as e:
+        assert e.message_dict['name'][0] == "I am happy to see you 42."
 
 class TestUserSerializer():
     def test_name(self) -> None:
diff --git a/stack_example/user/models.py b/stack_example/user/models.py
index 2d03e7a..7d92470 100644
--- a/stack_example/user/models.py
+++ b/stack_example/user/models.py
@@ -8,4 +8,4 @@ from django.contrib.auth.models import (
 
 class User(AbstractBaseUser, PermissionsMixin):
     name = models.CharField("Name", max_length=42, null=True, 
-        error_messages={'max_length':"I am happy to see you {max_length}."})
+        error_messages={'max_length':"I am happy to see you %(limit_value)s."})
diff --git a/stack_example/user/serializers.py b/stack_example/user/serializers.py
index ddd86ce..704f844 100644
--- a/stack_example/user/serializers.py
+++ b/stack_example/user/serializers.py
@@ -2,10 +2,9 @@ from rest_framework import serializers
 from user.models import User 
 
 class UserSerializer(serializers.ModelSerializer):
-
     class Meta:
         model = User
         fields = ["name"]
         extra_kwargs = {
-            "name": {"required": True, "allow_blank": False, "allow_null": False},
-    }
+            "name": {"required": True, "allow_blank": False, "allow_null": False, "error_messages": User._meta.get_field('name').error_messages},
+        }
-- 
2.20.1 (Apple Git-117)

自b5e0b90d8aea9348ef0de7624ad1460c06a2c44e周一2001年9月17日00:00:00
发件人:梅尔文
日期:2021年3月20日星期六00:30:29+0100
主题:[修补程序]修复(主):将错误消息添加到序列化程序
显然,ModelSerializer没有复制error\u messages属性
从模型字段,所以我们必须手工操作。
---
堆栈_示例/tests/test_user.py | 9+++++++++
stack|u示例/user/models.py | 2+-
stack_示例/user/serializers.py | 5++---
3个文件已更改,12个插入(+),4个删除(-)
diff——git a/stack\u example/tests/test\u user.py b/stack\u example/tests/test\u user.py
索引5aeba74..8493dc1 100644
---a/stack\u示例/tests/test\u user.py
+++b/stack_示例/tests/test_user.py
@@ -1,5 +1,14 @@
导入pytest
从user.serializer导入UserSerializer
+从user.models导入用户
+从django.core.exceptions导入ValidationError
+
+def测试_模型():
+user=user(name=“A”*43)
+尝试:
+user.clean_字段()
+除ValidationError为e外:
+断言e.message_dict['name'][0]==“很高兴见到你。”
类TestUserSerializer():
def测试名称(自身)->无:
diff——git a/stack\u example/user/models.py b/stack\u example/user/models.py
索引2d03e7a..7d92470 100644
---a/stack\u示例/user/models.py
+++b/stack_示例/user/models.py
@@-8,4+8,4@@从django.contrib.auth.models导入(
类用户(AbstractBaseUser,PermissionsMixin):
name=models.CharField(“name”,最大长度=42,null=True,
-error_messages={'max_length':“我很高兴见到你{max_length}。”)
+error_messages={'max_length':“我很高兴见到您%(limit_value)s.”)
diff——git a/stack\u example/user/serializers.py b/stack\u example/user/serializers.py
索引ddd86ce..704f844 100644
---a/stack\u示例/user/serializers.py
+++b/stack_示例/user/serializers.py
@@-2,10+2,9@@from rest\u framework导入序列化程序
从user.models导入用户
类UserSerializer(serializers.ModelSerializer):
-
类元:
模型=用户
字段=[“名称”]
额外费用={
-“name”:{“required”:True,“allow_blank”:False,“allow_null”:False},
-    }
+“name”:{“required”:True,“allow_blank”:False,“allow_null”:False,“error_messages”:User.\u meta.get_字段('name')。error_messages},
+        }
-- 
2.20.1(苹果Git-117)

可以浏览解决方案

我从您的尝试中看到,您正确地继承了CharField,但将其应用于模型字段,而正确的做法是在序列化程序中使用它。 这对我来说很有用:

从rest\u框架导入序列化程序
从rest_framework.fields导入CharField
从django.utils.translation导入gettext\u lazy作为_
从user.models导入用户
类CustomCharField(CharField):
默认错误消息={
“max_length”:(“很高兴见到你{max_length}”),
}
类UserSerializer(serializers.ModelSerializer):
name=CustomCharField(必需=True,allow\u blank=False,allow\u null=False,max\u length=42)
类元:
模型=用户
字段=[“名称”]
#额外费用={
#“name”:{“required”:True,“allow_blank”:False,“allow_null”:False},
# }

可以浏览此解决方案

,您有什么测试来暴露失败?@Melvyn-我添加了失败的测试,以及一个承载可工作的最小示例的repo。这是一个很棒的解决方案。我已经编写了它,并将其添加到存储库中。不幸的是,它不适用于用户模型。这是一个很棒的解决方案。我已经将它添加到存储库中。Good它不使用自定义类!我还发现其他消息是通过这种方式更新的,例如f
From b5e0b90d8aea9348ef0de7624ad1460c06a2c44e Mon Sep 17 00:00:00 2001
From: Melvyn <melvyn@stackexchange.site>
Date: Sat, 20 Mar 2021 00:30:29 +0100
Subject: [PATCH] fix(main): Add error_messages to serializer

Apparently the ModelSerializer doesn't copy the error_messages attribute
from the model field, so we have to do that by hand.
---
 stack_example/tests/test_user.py  | 9 +++++++++
 stack_example/user/models.py      | 2 +-
 stack_example/user/serializers.py | 5 ++---
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/stack_example/tests/test_user.py b/stack_example/tests/test_user.py
index 5aeba74..8493dc1 100644
--- a/stack_example/tests/test_user.py
+++ b/stack_example/tests/test_user.py
@@ -1,5 +1,14 @@
 import pytest
 from user.serializers import UserSerializer
+from user.models import User
+from django.core.exceptions import ValidationError
+
+def test_model():
+    user = User(name="A" * 43)
+    try:
+        user.clean_fields()
+    except ValidationError as e:
+        assert e.message_dict['name'][0] == "I am happy to see you 42."
 
 class TestUserSerializer():
     def test_name(self) -> None:
diff --git a/stack_example/user/models.py b/stack_example/user/models.py
index 2d03e7a..7d92470 100644
--- a/stack_example/user/models.py
+++ b/stack_example/user/models.py
@@ -8,4 +8,4 @@ from django.contrib.auth.models import (
 
 class User(AbstractBaseUser, PermissionsMixin):
     name = models.CharField("Name", max_length=42, null=True, 
-        error_messages={'max_length':"I am happy to see you {max_length}."})
+        error_messages={'max_length':"I am happy to see you %(limit_value)s."})
diff --git a/stack_example/user/serializers.py b/stack_example/user/serializers.py
index ddd86ce..704f844 100644
--- a/stack_example/user/serializers.py
+++ b/stack_example/user/serializers.py
@@ -2,10 +2,9 @@ from rest_framework import serializers
 from user.models import User 
 
 class UserSerializer(serializers.ModelSerializer):
-
     class Meta:
         model = User
         fields = ["name"]
         extra_kwargs = {
-            "name": {"required": True, "allow_blank": False, "allow_null": False},
-    }
+            "name": {"required": True, "allow_blank": False, "allow_null": False, "error_messages": User._meta.get_field('name').error_messages},
+        }
-- 
2.20.1 (Apple Git-117)