class VirtualNode(models.Model):
VIRTUAL_STATUS = (
(0, '已停止'),
(1, '已启动'),
(2, '正在创建'),
(3, '创建失败'),
)
virtual_id = models.AutoField(verbose_name="虚拟机 ID",primary_key=True)
virtual_name = models.CharField(max_length=30,verbose_name="虚拟机名")
virtual_ip = models.GenericIPAddressField(verbose_name="虚拟 IP")
virtual_cpu = models.IntegerField(verbose_name="虚拟机 cpu(核数)")
virtual_mem = models.IntegerField(verbose_name="虚拟机内存(GB)")
virtual_disk = models.IntegerField(verbose_name="虚拟机硬盘(GB)")
virtual_vmnode = models.ForeignKey(VmNode, verbose_name="所属宿主机")
virtual_vlan = models.ForeignKey(VlanInfo,verbose_name="所属 Vlan")
project = models.CharField(max_length=30,verbose_name="所属项目",null=True,blank=True)
virtual_staus = models.IntegerField(verbose_name='运行状态',choices=VIRTUAL_STATUS,default=0)
class Meta:
verbose_name = "虚拟机节点"
verbose_name_plural = verbose_name
class VirtualNodeForm(forms.ModelForm):
class Meta:
model = VirtualNode
fields = '__all__'
class VirtualNodeAddView(LoginRequireMixin, View):
def get(self, request):
pass
def post(self, request):
virtual_form = VirtualNodeForm(request.POST)
if virtual_form.is_valid():
virtual_form.save()
return JsonResponse({'status':'success'})
else:
msg = virtual_form.errors.values()
return JsonResponse({'status':'fail','msg':'虚拟机添加失败:{}'.format(msg)})
前端的表单只会填 6 个字段
其中 virtual_name 、virtual_ip 会根据某些条件算出后自动保存。
在views.py
里面怎么将virtual_name
virtual_ip
,回填到virtual_form
里,否在在下面的校验无法通过。
1
Hstar 2020-04-30 23:24:41 +08:00
不应该在 view 里处理,看下 form 的文档,定义两个函数 valid_virtual_name 和 valid_visual_ip 来生成数据
|
2
Hstar 2020-04-30 23:28:08 +08:00
记错了,应该是两个函数 clean_virtual_name 和 clean_virtual_name , 太久没用 form 这玩意。
看下 https://docs.djangoproject.com/en/3.0/ref/forms/validation/这一章 |
3
izzy27 2020-05-01 08:09:13 +08:00
Form 不要选__all__,把 virtual_name 和 virtual_ip 这两个字段排除掉,这样就不会校验这两个字段了
在你对应的 view 视图里面计算出正确的 virtual_name 和 virtual_ip 就行了 |
4
fanne OP @izzy27 #3 这个方法试过,但在最后的 virtual_form.save()这里,还是要把计算出的 virtual_name,virtual_ip 两个字塞回
virtual_form,否则数据也无法保存起来。现在不知道怎么塞进去。 |
5
fanne OP @Hstar #2
``` class UserAsk(models.Model): name = models.CharField(max_length=20,verbose_name=u"用户名") mobile = models.CharField(max_length=11,verbose_name=u"手机号码") course_name = models.CharField(max_length=50,verbose_name=u"课程名") add_time = models.DateTimeField(default=datetime.now) ``` ``` import re from django import forms from operation.models import UserAsk class UserAskForm(forms.ModelForm): class Meta: model = UserAsk exclude = ['add_time'] def clean_mobile(self): mobile = self.cleaned_data.get('mobile') if re.match(r'^(13\d|14[5|7]|15\d|166|17[3|6|7]|18\d)\d{8}$',mobile): return mobile else: raise forms.ValidationError(u"手机号码非法",code='mobile invalid') ``` 是不是类似这种的,可以对某些字段重新赋值,类似 return mobile,就可以把 mobile 字段重新赋值一个,然后返回所需要的 form,传递给 views |
6
izzy27 2020-05-01 09:28:18 +08:00
那你试一下在你的 form 里面重写 clean 函数,先获取父类的 clean 返回结果 cleaned_data,然后计算出 virtual_name 和 virtual_ip,然后 update
类似于这样 def clean(self): cleaned_data = super(VirtualNodeForm, self).clean() # 计算 virtual_name 和 virtual_ip cleaned_data.update(...) return cleaned_data |