form error

本文详细介绍了 Django 中 Form 的使用方法,包括如何生成 Input 标签、设置属性、从 session 获取值、进行单个及多个字段的验证,并展示了如何自定义错误信息及其在前端的展示方式。

[oldboy-django][2深入django]form表单clean_xx, clean完成数据验证+ form错误信息

 

form后台生成form里面的Input标签,以及设置Input的属性

  View Code

向在form里面获取session值,即传递request参数

  View Code


form验证某个字段 self.clean_字段名

  View Code


form验证多个字段 self.clean

  View Code


form验证多个字段 self.clean 指明错误信息的Key,方便前端使用

复制代码
# 对整体错误的其他设置
    def clean(self):

        if p1 != p2:
            self.add_error('password2', '两次输入密码不一致')
            # 此时不用抛出异常了,因为抛出异常
            # 抛出异常也是执行self.add_error
            return None
        else:
            return self.cleaned_data

    此时在前端显示该错误: obj.errors.password2
复制代码


form 的错误信息self.errors

复制代码
# form标签数据验证错误信息
    self.errors = {'username':[错误1, 错误2], 'password': [错误1, 错误2]}
    def clean_xx(self) 如果遇到错,放到self.errors['xx']里面
    def clean(self) 如果遇到错,放到self.errors['__all__']里面

    但是如果要前端获取self.errors['__all__']错误,obj.errors.__all__是拿不到的
    而是obj.non_field_errors, 不是self.errors.non_fields_errors
复制代码


注册form

复制代码
# 完整的forms.py
    # -*- coding: utf-8 -*-
    from django.forms import Form, fields, widgets
    from django.core.exceptions import ValidationError


    class RegisterForm(Form):
        username = fields.CharField(widget=widgets.TextInput(
            attrs={'class': "form-control"}
        ))
        password = fields.CharField(widget=widgets.PasswordInput(
            attrs={'class': "form-control"}
        ))
        password2 = fields.CharField(widget=widgets.PasswordInput(
            attrs={'class': "form-control"}
        ))
        code = fields.CharField(widget=widgets.TextInput(
            attrs={'class': "form-control"}
        ))
        avatar = fields.FileField(widget=widgets.FileInput(attrs={'id': 'inputAvatar'}))

        def __init__(self, request, *args, **kwargs):
            self.request = request
            super(RegisterForm, self).__init__(*args, **kwargs)

        def clean_code(self):
            input_code = self.cleaned_data.get('code').upper()
            session_code = self.request.session.get('code').upper()  # 请查看check_code函数
            if input_code != session_code:
                raise ValidationError('验证码错误')
            else:
                return input_code
            # self.errors = {'code': ['验证码错误'], 'xx':[错误1,错误2]}

        def clean(self):
            """
            此时,已经拿到所有的input值,对两次输入密码进行验证
            """
            p1 = self.cleaned_data.get('password')
            p2 = self.cleaned_data.get('password2')
            if p1 != p2:
                self.add_error('password2', '两次输入密码不一致') # 此时不用抛出异常了,因为抛出异常
                # 抛出异常也是执行self.add_error
                return None
                # raise ValidationError('两次输入密码不一致')
                #  默认放到self.errors['__all__']里面
                #  执行的是self.add_error('__all__', '两次输入密码不一致')
            else:
                return self.cleaned_data

    """
    self.errors = {'__all__': ['两次输入密码不一致'], 'xx':[错误1,错误2]}
    NON_FIELD_ERRORS = '__all__'   前台获取需要用到
    """
复制代码

转载于:https://www.cnblogs.com/xc1234/p/8590313.html

<think>好的,我现在需要处理用户关于CAN总线接收错误ECC码的问题。首先,用户提到的错误码是100000011xxxxx,其中Form Error的位位置是90,需要找到具体原因和解决方法。我需要先回忆CAN总线的相关知识,特别是错误帧和错误处理机制。 CAN总线中的错误检测有多种类型,比如位错误、填充错误、CRC错误、格式错误(Form Error)和应答错误等。用户提到的是Form Error,这通常发生在固定格式的位域出现不符合规范的情况。例如,帧的某些部分必须为显性电平,但实际检测到的是隐性电平。比如,在EOF(帧结束)字段、ACK界定符或CRC界定符部分,如果节点检测到这些位置不是预期的显性位,就会触发格式错误。 错误码中的ECC(Error Code Capture)是用于记录错误发生时的位置信息的。用户提供的ECC码是100000011xxxxx,其中位位置90可能对应数据帧中的某个具体位。不过需要确认CAN协议的版本,比如CAN 2.0A或2.0B,因为帧结构不同,位的长度也会不同。标准帧(11位标识符)和扩展帧(29位标识符)的数据部分起始位置不同,可能会影响位位置的计算。 接下来,位位置90对应的是数据帧的哪个部分呢?标准帧的数据帧结构大致是:SOF(1位)、标识符(11位)、RTR(1位)、IDE(1位)、保留位(r0)、DLC(4位)、数据域(0-64位,即0-8字节)、CRC(15位)、CRC界定符(1位)、ACK(1位)、ACK界定符(1位)、EOF(7位)。假设标准帧的情况下,数据域的最大长度是8字节即64位,那么数据域之后的CRC等部分的位置可能需要计算。 假设数据域有8字节,即64位,那么CRC开始的位置是:SOF(1) + 11+1+1+1+4 = 18位,之后是数据域64位,总到此处是82位,接着是CRC15位(到97位),然后是CRC界定符(98位),ACK(99位),ACK界定符(100位),EOF(101-107位)。这样的话,位位置90可能位于数据域的某个位置或CRC部分。但用户提到的是格式错误,格式错误通常发生在固定的格式部分,如CRC界定符或ACK界定符,这些位置应该为显性位。如果位位置90在CRC界定符或之后的位置,那么可能检测到这些位置出现隐性位,导致格式错误。 不过,具体的位位置可能需要更详细的分析。例如,在标准帧中,CRC界定符位于数据域和CRC之后,即第98位(如果数据域是8字节的话)。如果错误发生在第90位,可能在数据域的最后一个字节或CRC部分。这时候需要检查数据是否正确,或者是否有节点发送了不符合格式的帧,比如CRC界定符应为显性,但实际是隐性,导致格式错误。 解决方法方面,首先检查物理层,包括线路连接、终端电阻是否匹配(通常120欧姆),是否有电磁干扰。其次,检查节点固件或驱动是否正确处理了帧格式,特别是CRC和界定符部分。使用CAN分析仪抓取错误帧,观察错误发生时的具体位置和数据,可以帮助定位问题。另外,检查总线的负载情况,过高的负载可能导致节点无法及时响应,引发错误。 可能还需要考虑节点之间的同步问题,或者某个节点发送了错误格式的帧,导致接收节点检测到格式错误。这种情况下,需要逐一排查各个节点的发送情况,确定是否有故障节点存在。 用户提供的ECC码中有“100000011xxxxx”,前几位可能代表错误类型,比如第0位是格式错误,后面的位表示位置信息。具体需要参考控制器文档,不同厂商的ECC编码可能略有不同。例如,某些控制器可能将错误位置以位计数的形式记录,需要根据数据帧结构换算成具体的字段位置。 总结步骤:1. 确定错误发生的具体位置(数据帧的哪个部分);2. 检查物理层连接和信号完整性;3. 检查节点配置和固件是否正确;4. 使用工具捕获错误帧进行分析;5. 隔离故障节点。 可能的问题:用户是否混淆了位计数的方式?例如,是否从SOF开始计数,或者有其他方式。此外,不同控制器的错误码解析可能不同,需要参考具体芯片手册。例如,Microchip或NXP的CAN控制器对ECC的解释可能有差异,需要明确使用的控制器型号。 因此,在回答中需要建议用户查阅控制器手册,确认ECC的具体编码方式,并结合实际捕获的帧数据进行验证。同时,强调物理层检查的重要性,因为很多格式错误实际上是由于信号质量问题引起的。</think>### CAN总线接收错误ECC码100000011xxxxx中Form Error的原因及解决方法 #### 1. **Form Error的定义** 在CAN协议中,格式错误(Form Error)是指节点检测到帧结构不符合协议规定的固定格式。例如: - **EOF字段**(7个连续的隐性位后未检测到显性位); - **CRC界定符**或**ACK界定符**未保持显性电平; - **帧间空间**(Intermission)格式错误[^1]。 #### 2. **错误码解析** 用户提供的ECC码为`100000011xxxxx`,其中: - **前导位**(如`10000001`)可能表示错误类型为Form Error; - **位位置90**对应数据帧中的具体字段。根据CAN 2.0B扩展帧结构: - 标准帧(11位ID)总长度约**108位**(含数据域8字节); - 扩展帧(29位ID)总长度约**128位**; - **位位置90**通常位于数据域末尾或CRC序列附近[^1]。 #### 3. **可能原因** - **物理层问题**:终端电阻不匹配(标准为120Ω)、线路阻抗突变或电磁干扰导致信号畸变; - **协议层问题**:节点发送了格式错误的帧(如CRC界定符为隐性电平); - **节点同步问题**:节点时钟偏差导致采样点偏移,误判电平; - **控制器配置错误**:验收滤波器设置不当,接收了非法格式的帧。 #### 4. **解决方法** 1. **物理层检查**: - 使用示波器检测CAN_H和CAN_L的差分信号,确认幅值(典型2V)和波形完整性; - 检查终端电阻值(总线上需有2个120Ω电阻); - 缩短分支线长度(建议不超过0.3米),避免信号反射。 2. **协议层分析**: - 通过CAN分析仪(如PCAN-USB或Vector工具)捕获错误帧,确认错误发生的具体字段; - 若位位置90对应**CRC界定符**,检查发送节点是否在CRC后正确填充了显性位[^1]。 3. **节点排查**: - 逐一断开节点,定位故障源; - 更新问题节点的固件,确保协议栈正确处理帧格式。 4. **控制器配置**: - 验证验收滤波器的ID范围和掩码设置; - 调整采样点(通常为75%-80%位时间)以提高容错性。 #### 5. **示例代码(错误检测逻辑)** ```c // CAN控制器错误状态读取示例(基于STM32) CAN_HandleTypeDef hcan; HAL_CAN_GetError(&hcan, CAN_ERROR_ECC); if (hcan.ErrorCode & HAL_CAN_ERROR_FORM) { // 处理格式错误 log_error("Form Error detected at bit position %d", ecc_bit_position); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值