Django从[ErrorDetail(string ='Test Message',code ='invalid')]中提取字符串

时间:2018-08-29 14:36:35

标签: django python-3.x templates serialization django-rest-framework

我只想在模板中显示字符串变量中的消息,但我不知道如何显示。我正在使用Django Rest Framework。我的代码:

form.html

<p>{{ serializer.amount.errors }}</p>

serializers.py

from rest_framework import serializers
from .models import Data, Material


class DataSerializer(serializers.ModelSerializer):

class Meta:
    model = Data
    fields = ('order_date', 'material', 'amount', 'delivery_number', 'employee')
    read_only_fields = ('id', 'insert_time')
    extra_kwargs = {"amount": {"error_messages": {"invalid": "Test Message"}}}

views.py

class Form(APIView):

renderer_classes = [TemplateHTMLRenderer]
template_name = 'zulieferung/form.html'

def get(self, request):
    materials = Material.objects.distinct('material_unit_id')
    return Response({'all_materials': materials})

def post(self, request):
    materials = Material.objects.all()
    serializer = DataSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response({'all_materials': materials}, status=status.HTTP_201_CREATED)
    return Response({'serializer': serializer}, status=status.HTTP_400_BAD_REQUEST)

在我的模板中,我不是 测试消息 ,而是 [ErrorDetail(string ='Test Message',code ='invalid')]]

enter image description here

3 个答案:

答案 0 :(得分:1)

您应该尝试使用模板

{% for error in serializer.amount.errors %}
    {{ error }}
{% endofor %}

但是我不明白您为什么将django rest_framework与HTML模板一起使用。 Rest框架用于REST API,这绝对不是这种情况。为此,请使用django.forms。使用直接渲染到HTML模板的REST序列化器确实没有任何意义。

链接:

Working with forms

When to use REST framework

答案 1 :(得分:1)

您可以从 rest_framework.exceptions.ValidationError 对象中获取错误信息,如下所示

err = ErrorDetail(string='User with the given Email exists', code='invalid')
err_message = err.args[0]["error"]

答案 2 :(得分:1)

<块引用>

由于序列化器的错误在一个列表中,所以你必须更加小心地处理它, 我提出了一个非常直接和直观的解决方案来从对象中获取 string 值。

for key, values in serializers.errors.items():
   error = [value[:] for value in values]
   print(error)
<块引用>

然后你可以得到一个列表中的所有错误。尽管字段在列表中有多个错误。所以我的代码可以从 ErrorDetail() 对象中提取字符串。