Django技术问题:如何将视图数据传递至表单进行验证
解决方案
1. 修正视图中表单数据的传递方式
Django表单初始化不支持直接传入额外字段参数,你需要复制request.POST的可变副本,替换其中的phone_numbers值为拼接后的字符串,再传给表单:
def register_user(request): context = {} if request.method == 'POST': # 复制POST数据(request.POST为不可变对象,需转为可变副本) post_data = request.POST.copy() numbers = post_data.getlist('phone_numbers') # 将数组拼接为分号分隔的字符串 post_data['phone_numbers'] = ";".join(numbers) # 使用修改后的数据集初始化表单 form = RegisterForm(post_data) else: form = RegisterForm() context['form'] = form return render(request, 'authentication/register.html', context)
2. 修正表单验证逻辑
原验证逻辑仅针对单个手机号,现在字段存储的是分号分隔的多个号码,需拆分后逐个验证:
from django import forms from .models import Accounts import re class RegisterForm(forms.ModelForm): confirm_password = forms.CharField() class Meta: model = Accounts fields = ('phone_numbers',) # 务必加逗号,确保是元组类型 def clean_phone_numbers(self): phone_numbers_str = self.cleaned_data['phone_numbers'] # 拆分分号分隔的号码 phone_numbers = phone_numbers_str.split(';') regex = '^[0-9]{10,15}$' for number in phone_numbers: number = number.strip() # 去除号码前后可能的空格 if not number: raise forms.ValidationError('手机号码不能为空') if len(number) < 10 or len(number) > 15: raise forms.ValidationError(f'号码 {number} 长度必须在10-15位之间') if not re.fullmatch(regex, number): raise forms.ValidationError(f'号码 {number} 只能包含数字') # 验证通过后返回拼接后的字符串 return phone_numbers_str
3. 其他细节修正
- 模型类中
phone_numbers字段多了一个闭合括号:models.CharField(max_length=255))→ 修改为models.CharField(max_length=255) - 表单Meta的
fields必须是元组,若仅单个字段需加尾随逗号,否则会被识别为字符串导致表单加载异常
内容的提问来源于stack exchange,提问作者steeves
相关产品推荐
相关产品推荐

