python django forms.ModelForm 数据校验

前端返回的数据 想做数据校验 前面的buyerTel可以校验成功但是 在datas字典中的数据没有进行校验 有没有人可以指点一二

img

后台代码


  form = T_Data_List_js(data=request.POST)
    if form.is_valid():
        xiugai = models.T_Data_List.objects.filter(userID=uidf["userID"], tradeNo=form.cleaned_data['tradeNo']).first()
        if not xiugai:
            form.instance.userID = uidf["userID"]  # 将本账号的userID进行保存
            form.save()  ###保存
        else:
            form = T_Data_List_js(data=request.POST, instance=xiugai)
            form.save() ###修改

        form_lsit = T_data_list_mx_js(data=request.POST)
        print(request.POST)
        if form_lsit.is_valid():
            pass
        else:
            print(form_lsit.errors)
    else:
        print(form.errors)

前端 代码是这样的


```html

            var _arr = [];
            $(".piao-form").find(".piao-row").each(function (item) {
                var obj = {};
                $(this).find('input').each(function () {
                    obj[$(this).attr("name")] = $(this).val();
                    // obj[$(this).attr("name")] = new Array($(this).val());
                })
                _arr.push(obj);


 $.ajax({
                url: "/invoice/start/",
                type: "post",
                data: {
                    taxpayerNum: $("#taxpayerNum").val(),
                    invoiceReqSerialNo: "发票请求流水号",
                    invoiceIssueKindCode: $("#fp_zl").val(),
                    buyerName: $("#erp_khcm").val(),
                    buyerTaxpayerNum: $("#erp_sh").val(),
                    buyerAddress: $("#erp_fpdz").val(),
                    buyerTel: $("#fp_dh").val(),
                    buyerBankName: $("#erp_khh").val(),
                    buyerBankAccount: $("#erp_yhzh").val(),
                    sellerAddress: $("#xs_dz").val(),
                    sellerTel: $("#xs_dh").val(),
                    sellerBankName: $("#xs_khh").val(),
                    sellerBankAccount: $("#xs_zh").val(),
                    casherName: $("#skr").text(),
                    reviewerName: $("#fhr").text(),
                    takerName: $("#kpr").text(),
                    takerTel: $("#fp_dh").val(),
                    takerEmail: $("#fp_yx").val(),
                    remark: $("#beizhu").val(),
                    definedData: $("#b2b_djbh").val(),
                    tradeNo: $("#erp_djbh").val(),
                    account: "开票人税务局账号",
                    datas: JSON.stringify(_arr)
                },
                dataType: "json",
                success: function (res) {
                    alert("接收返回并给显示出来")
                }


```

T_data_list_mx_js 这句 想要校验 datas的数据。但是目前没办法校验 而且给返回了 字段必须填写

你的问题可能是由于你没有在你的表单类中定义datas字段,或者没有在datas字段上添加@Valid或@Validated注解,导致datas字典中的数据没有进行校验。你可以尝试在你的T_Data_List_js类中添加如下代码:

Python
此代码由 AI 生成。仔细查看和使用。有关详细信息,请访问我们的常见问题解答。

class T_Data_List_js(forms.ModelForm):
    # 其他字段
    datas = forms.CharField() # 定义datas字段
    class Meta:
        model = models.T_Data_List
        fields = "__all__"
        # 其他选项
    @validates('datas') # 添加校验装饰器
    def validate_datas(self, value):
        # 对value进行校验,value是一个JSON字符串,可以用json.loads()转换为字典
        # 如果校验失败,可以抛出ValidationError异常
        pass
根据第二个网页,你也可以使用django-rest-framework的序列化器来对前端返回的数据进行校验,序列化器可以自动处理JSON数据,并提供了多种内置的校验器和自定义校验方法。你可以参考以下代码:

Python
此代码由 AI 生成。仔细查看和使用。有关详细信息,请访问我们的常见问题解答。

from rest_framework import serializers

class T_data_list_mx_jsSerializer(serializers.Serializer):
    # 定义datas字典中的字段和类型,例如:
    name = serializers.CharField(max_length=100)
    price = serializers.DecimalField(max_digits=10, decimal_places=2)
    # 其他字段

class T_Data_List_jsSerializer(serializers.ModelSerializer):
    # 其他字段
    datas = T_data_list_mx_jsSerializer(many=True) # 定义datas字段,并指定使用嵌套的序列化器
    class Meta:
        model = models.T_Data_List
        fields = "__all__"
        # 其他选项

# 在视图中使用序列化器进行校验
def my_view(request):
    serializer = T_Data_List_jsSerializer(data=request.POST)
    if serializer.is_valid():
        # 保存或更新数据
        pass
    else:
        # 返回错误信息
        print(serializer.errors)

可以参考一下

from django.shortcuts import render
from .forms import MyModelForm

def my_view(request):
    if request.method == 'POST':
        form = MyModelForm(request.POST)
        if form.is_valid():
            # 表单数据校验通过,可以进行进一步处理
            # 使用form.cleaned_data来获取经过校验的数据
            buyer_tel = form.cleaned_data['buyerTel']
            other_data = form.cleaned_data['datas']['otherField']  # 假设datas中还有其他字段

            # 进行处理...

        else:
            # 表单数据校验不通过,返回错误信息给前端
            # form.errors包含错误信息
            errors = form.errors
            return render(request, 'my_template.html', {'form': form, 'errors': errors})
    else:
        form = MyModelForm()

    return render(request, 'my_template.html', {'form': form})


引用chatgpt内容作答:
根据你提供的代码,以下是一些可能的修改和建议:

后端代码:

form = T_Data_List_js(data=request.POST)
if form.is_valid():
    xiugai = models.T_Data_List.objects.filter(userID=uidf["userID"], tradeNo=form.cleaned_data['tradeNo']).first()
    if not xiugai:
        form.instance.userID = uidf["userID"]
        form.save()  # 保存
    else:
        form = T_Data_List_js(data=request.POST, instance=xiugai)
        form.save()  # 修改

    form_lsit = T_data_list_mx_js(data=request.POST)
    if form_lsit.is_valid():
        # 处理 form_lsit 的有效数据
    else:
        errors = form_lsit.errors.as_json()
        return JsonResponse({'form_lsit_errors': errors})

else:
    errors = form.errors.as_json()
    return JsonResponse({'form_errors': errors})

在上面的代码中,当表单验证失败时,我返回了一个JSON响应,其中包含了表单错误信息。这样可以使你在前端更容易地获取和显示错误信息。

前端代码:

你的前端代码看起来基本上是正确的。但是,我建议你在发送AJAX请求之前,对数据进行一些基本的验证,以防止一些常见的错误。你可以使用JavaScript来做这些验证。例如:

var _arr = [];
$(".piao-form").find(".piao-row").each(function () {
    var obj = {};
    $(this).find('input').each(function () {
        var value = $(this).val().trim();  // 去除首尾空格
        var name = $(this).attr("name");
        
        if (name === "buyerTel" && value === "") {
            // 对于 buyerTel,可以做一些特定的验证,这只是一个示例
            alert("买家电话不能为空");
            return false;  // 停止循环
        }
        
        obj[name] = value;
    });
    
    _arr.push(obj);
});

// 发送AJAX请求
$.ajax({
    url: "/invoice/start/",
    type: "post",
    data: {
        // ... 你的数据
        datas: JSON.stringify(_arr)
    },
    dataType: "json",
    success: function (res) {
        // 根据后端返回的响应进行处理,例如显示成功消息
        alert("接收返回并显示出来");
    },
    error: function (xhr, textStatus, errorThrown) {
        // 处理AJAX请求错误,例如显示错误消息
        alert("发生错误:" + textStatus);
    }
});

在上面的代码中,我添加了对buyerTel字段的基本验证,以确保其不为空。你可以根据需要添加其他字段的验证。同时,我还添加了对AJAX请求错误的处理,以便你能够更好地处理请求问题。记得根据具体的验证需求来修改这些代码。

【以下回答由 GPT 生成】

如果使用Django中的forms.ModelForm进行数据校验时,可以通过以下步骤来处理数据校验失败的情况:

  1. 首先,你需要在后台代码中创建一个表单类(Form Class)继承自forms.ModelForm,并定义需要校验的字段。例如,你可以创建一个名为T_Data_List_js的表单类来校验前端返回数据:
from django import forms
from .models import T_Data_List

class T_Data_List_js(forms.ModelForm):
    class Meta:
        model = T_Data_List
        fields = ['buyerName', 'buyerTel']  # 定义需要校验的字段
  1. 在后台代码中,实例化该表单类,并传入前端传递的数据(request.POST):
form = T_Data_List_js(data=request.POST)
  1. 接下来,使用表单对象的is_valid()方法进行数据校验。如果校验通过,则可以保存数据;如果校验失败,则进行相应的处理:
if form.is_valid():
    # 数据校验通过,可以继续处理
    xiugai = models.T_Data_List.objects.filter(userID=uidf["userID"], tradeNo=form.cleaned_data['tradeNo']).first()
    if not xiugai:
        form.instance.userID = uidf["userID"]
        form.save()  # 保存数据
    else:
        form = T_Data_List_js(data=request.POST, instance=xiugai)
        form.save()  # 修改数据
else:
    # 数据校验失败,可以根据错误信息进行相应处理
    print(form.errors)
  1. 如果还需要对其他字段进行校验,可以创建相应的表单类,并进行相似的处理。

希望以上步骤对你有所帮助。如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:根据您的描述,buyerTel字段的数据校验成功,但是datas字典中的数据没有进行校验。这是因为datas是一个JSON字符串,而不是一个表单对象,因此无法直接使用ModelForm进行校验。
如果您需要对datas进行数据校验,可以考虑以下几个步骤:
1、 创建一个新的表单类来处理datas的数据校验。您可以使用Django的Form类来实现自定义表单。

from django import forms

class DatasForm(forms.Form):
    datas = forms.CharField()

2、 在后台代码中,实例化新的表单类并进行数据校验。

datas_form = DatasForm(request.POST)
if datas_form.is_valid():
    datas = datas_form.cleaned_data['datas']
    # 进行数据处理或保存操作
else:
    print(datas_form.errors)

在上述代码中,我们首先实例化了DatasForm,然后使用is_valid()方法对数据进行校验。如果校验成功,您可以通过cleaned_data属性获取校验后的数据。
请注意,由于datas是一个JSON字符串,您可能需要在前端确保它符合JSON格式,并在后台进行适当的处理,例如使用json.loads()方法将其转换为字典。
以下是根据您的需求进行修改后的完整代码示例:

# forms.py
from django import forms

class T_Data_List_js(forms.ModelForm):
    class Meta:
        model = models.T_Data_List
        fields = ['tradeNo']  # 根据您的实际需要选择要包含的字段

class T_data_list_mx_js(forms.ModelForm):
    class Meta:
        model = models.T_data_list_mx
        fields = ['field1', 'field2']  # 根据您的实际需要选择要包含的字段

class DatasForm(forms.Form):
    datas = forms.CharField()

# views.py
from django.shortcuts import render
from .forms import T_Data_List_js, T_data_list_mx_js, DatasForm
import json

def your_view(request):
    if request.method == 'POST':
        form = T_Data_List_js(data=request.POST)
        if form.is_valid():
            xiugai = models.T_Data_List.objects.filter(userID=uidf["userID"], tradeNo=form.cleaned_data['tradeNo']).first()
            if not xiugai:
                form.instance.userID = uidf["userID"]  # 将本账号的userID进行保存
                form.save()
            else:
                form = T_Data_List_js(data=request.POST, instance=xiugai)
                form.save()
            
            datas_form = DatasForm(request.POST)
            if datas_form.is_valid():
                datas = json.loads(datas_form.cleaned_data['datas'])
                # 进行数据处理或保存操作
            else:
                print(datas_form.errors)
            
            form_lsit = T_data_list_mx_js(data=request.POST)
            if form_lsit.is_valid():
                pass
            else:
                print(form_lsit.errors)
        else:
            print(form.errors)
    else:
        form = T_Data_List_js()
    
    return render(request, 'your_template.html', {'form': form})

请注意,上述代码中的your_view是一个示例视图函数,您需要将其替换为您自己的视图函数,并将模板文件路径和其他相关代码进行适当的修改以适应您的项目结构和需求。

该代码示例包括了对T_Data_List_jsT_data_list_mx_js表单的数据校验,以及对datas字段的数据校验。在数据校验通过后,您可以根据实际需求进行进一步的数据处理或保存操作。

希望这个完整代码示例能够帮助您解决问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

结合GPT给出回答如下请题主参考
在Django表单中,对于ModelForm,数据校验分为两个部分:模型字段验证和表单字段验证。默认情况下,模型字段将会通过验证,但是表单字段验证需要手动添加到表单中。

模型字段验证基本上已经由Django自动完成。但是,表单字段验证需要我们使用表单的is_valid()方法,并且将表单数据作为参数传递进去。在这种情况下,is_valid()将检查表单字段是否符合所需的数据格式规则,并返回一个布尔值。

在你的代码中,你需要手动添加表单字段验证。你可以通过在form表单中添加字段的clean()方法来实现这一点。

以下是示例代码,以验证datas中的所有数据:

class T_Data_List_js(forms.ModelForm):
    class Meta:
        model = T_Data_List
        fields = '__all__'
        
    # 添加数据验证
    def clean(self):
        cleaned_data = super().clean()
        datas = cleaned_data.get('datas')
        
        # 对于datas中的每个字段进行验证
        for data in datas:
            if not data.get('isRequired'):
                if not data.get('value'):
                    raise forms.ValidationError('数据不能为空')
            elif data.get('type') == 'mobile':
                if not re.match(r'^1[3-9]\d{9}$', data.get('value')):
                    raise forms.ValidationError('电话号码格式错误')
        return cleaned_data

在这个示例中,clean()方法中,首先获取表单数据中的datas字典,然后对于这个字典中的每个元素,进行我们想要的数据验证。如果存在数据不符合数据格式要求,那么就抛出一个ValidationError,该错误将从您的表单中返回到前端。

希望这能帮到你,如有疑问,请在评论区中提问。

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

根据你的描述,你想要对通过ajax发送到服务器的数据进行校验。首先,你需要确保你的服务器能够正确地解析和验证这些数据。如果服务器返回的数据没有通过校验,那么问题可能出在服务器端。
但是,如果你想在前端进行数据校验,你可以在发送数据到服务器之前进行验证。

过滤器校验

【Django】数据校验
可以参考下


https://www.cnblogs.com/xingxia/p/django_forms.html

引用 皆我百晓生 小程序回复内容作答:

根据你的代码,T_Data_List_js和T_data_list_mx_js都是Django的ModelForm类。ModelForm类默认情况下只会对模型中的字段进行校验,而不会对其他非模型字段进行校验。

如果你需要对datas字段中的数据进行校验,可以在T_data_list_mx_js类中添加验证逻辑。可以在clean()方法中对datas字段进行校验,并在校验失败时抛出ValidationError异常。

以下是一个示例代码:

class T_data_list_mx_js(forms.ModelForm):
    datas = forms.CharField()

    class Meta:
        model = models.T_data_list_mx
        fields = "__all__"

    def clean_datas(self):
        datas = self.cleaned_data.get('datas')
        # 在这里对datas进行校验逻辑
        # 如果校验失败,可以抛出ValidationError异常
        return datas

在clean_datas()方法中,你可以添加自定义的校验逻辑,如果校验失败,可以抛出ValidationError异常。校验通过后,cleaned_data中会包含验证过的datas数据。

希望对你有帮助!如果还有其他问题,请随时追问。


表单和字段验证 | Django 文档 | Django https://docs.djangoproject.com/zh-hans/4.2/ref/forms/validation/

在 Django 中,ModelForm 提供了数据校验的功能。如果表单验证失败,它会返回一个带有错误信息的表单,而不是将数据提交到数据库。

在你的情况中,假设你有一个 buyerTel 字段需要校验,你需要在你的 ModelForm 中重写 clean 方法。clean 方法是一个自定义的验证方法,用于对表单数据进行额外的校验。

参考结合AI智能、文心一言等综合回答,若有帮助,恭请采纳。

在Django中,表单数据在提交到服务器之前需要进行校验,以确保其按照预期的格式和约束规则进行填写。Django提供了内置的表单验证方法,可以通过在表单中定义一个ModelForm类来使用。

ModelForm是一个特殊的表单类,它可以自动从一个数据模型中创建表单,包括表单字段和验证规则。通过使用ModelForm类,我们可以轻松地创建一个表单,而无需手动编写每一个字段和验证规则。

使用ModelForm进行数据校验的步骤如下:

  1. 定义一个ModelForm类。

例如,我们可以定义一个模型类User,并创建一个ModelForm类来自动生成一个用户信息表单(包含用户名和密码):

from django import forms
from .models import User

class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'password']
        widgets = {
            'password': forms.PasswordInput(),
        }

在这个例子中,我们定义了一个名为UserFormModelForm类。Meta类中定义了与模型的字段对应的表单字段。

  1. 实例化表单对象

在视图函数中,我们可以通过实例化UserForm来创建一个表单对象:

def register(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            # 处理表单数据
            pass
    else:
        form = UserForm()
    return render(request, 'register.html', {'form': form})

在这个例子中,我们创建了一个名为formUserForm对象。如果请求方法为POST,则调用is_valid()方法对表单数据进行校验。如果校验通过,我们可以处理表单数据。

  1. 显示表单错误信息

如果表单校验失败,我们可以通过在模板中显示错误信息来帮助用户修正错误。在模板中,可以通过form.errors属性来获取表单错误信息:

{% if form.errors %}
<div class="alert alert-danger" role="alert">
    <strong>有错误发生:</strong>
    <ul>
        {% for field_error in form.errors %}
        <li>{{ field_error }}</li>
        {% endfor %}
    </ul>
</div>
{% endif %}

<form method="post">
    {% csrf_token %}
    <div class="form-group">
        {{ form.username.label_tag }}
        {{ form.username }}
    </div>
    <div class="form-group">
        {{ form.password.label_tag }}
        {{ form.password }}
    </div>
    <button type="submit" class="btn btn-primary">注册</button>
</form>

在这个例子中,我们在模板中使用了错误信息的简单逻辑来显示错误信息。form.errors是一个字典,其中的键是字段名,值是列表,每个元素表示一个错误信息。

总结:使用ModelForm类可以简化表单创建和验证的过程。我们可以通过定义ModelForm类来自动生成表单,并通过调用is_valid()方法来对表单数据进行校验。如果表单校验失败,我们可以在模板中显示错误信息来帮助用户修正错误。

参考gpt
根据您提供的代码,您正在使用Django的forms.ModelForm进行数据校验。根据您的描述,buyerTel字段的数据校验成功,但是datas字典中的数据没有进行校验。

问题可能出在您的代码逻辑中。根据您提供的代码,您只对form和form_lsit进行了校验,但是没有对datas字典中的数据进行校验。您可以尝试将datas字典中的数据也添加到一个表单中,然后对该表单进行校验。

具体来说,您可以创建一个新的表单类,将datas字典中的数据添加为表单字段。然后,您可以在视图函数中实例化这个新的表单类,并对其进行校验。

下面是一个示例代码,演示如何将datas字典中的数据添加为表单字段,并对其进行校验:

class DatasForm(forms.Form):
    data_1 = forms.CharField()
    data_2 = forms.CharField()

# 在视图函数中使用新的表单类进行校验
form_datas = DatasForm(data=request.POST)
if form_datas.is_valid():
    # 数据校验成功,可以进行后续操作
    data_1 = form_datas.cleaned_data['data_1']
    data_2 = form_datas.cleaned_data['data_2']
    # 其他逻辑
else:
    # 数据校验失败,处理错误
    print(form_datas.errors)

数据弄出来,逐个校验

datas字典中的数据没有进行校验,用Django的forms.Form来创建一个自定义表单类,并在其中定义datas字段,然后在后台代码中使用这个表单类进行数据校验

djiango表单验证机制。参考https://pythonjishu.com/eqhfrbtqynypfjf/