【问题标题】:Django extract string from [ErrorDetail(string='Test Message', code='invalid')]Django 从 [ErrorDetail(string='Test Message', code='invalid')] 中提取字符串
【发布时间】:2019-02-04 09:38:11
【问题描述】:

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

form.html

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

序列化器.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)

我的模板中没有 Test Message 我有 [ErrorDetail(string='Test Message', code='invalid')]

【问题讨论】:

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


    【解决方案1】:

    你可以通过这种方式从ErrorDetail对象中获取字符串:-

    >>> op = ErrorDetail(string='Value must be valid JSON or key, valued pair.', code='invalid')
    >>> op.title()
    'Value must be valid JSON or key, valued pair.'
    

    【讨论】:

    • 这对我很有帮助
    【解决方案2】:

    你应该在你的模板中尝试

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

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

    链接:

    Working with forms

    When to use REST framework

    【讨论】:

    • 非常感谢!它正在工作。我会阅读有关表格的信息,我认为 drf 对我的应用程序会更好。再次感谢!
    【解决方案3】:

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

    for key, values in serializers.errors.items():
       error = [value[:] for value in values]
       print(error)
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        >>> error = ErrorDetail(string='Value must be valid JSON or key, valued pair.', code='invalid')
        >>> str(error)
        'Value must be valid JSON or key, valued pair.'
        

        【讨论】:

          猜你喜欢
          • 2023-03-15
          • 2017-10-18
          • 1970-01-01
          • 2012-04-21
          • 1970-01-01
          • 2021-09-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多