跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • django modelform 问题请教
未分類
25 4 月 2020

django modelform 问题请教

django modelform 问题请教

資深大佬 : fanne 8

models.py
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 
forms.py
class VirtualNodeForm(forms.ModelForm):     class Meta:         model = VirtualNode         fields = '__all__' 
vievws.py
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 个字段 django modelform 问题请教

其中 virtual_name 、virtual_ip 会根据某些条件算出后自动保存。

那么问题来了

在views.py里面怎么将virtual_name virtual_ip,回填到virtual_form里,否在在下面的校验无法通过。

大佬有話說 (6)

  • 資深大佬 : Hstar

    不应该在 view 里处理,看下 form 的文档,定义两个函数 valid_virtual_name 和 valid_visual_ip 来生成数据

  • 資深大佬 : Hstar

    记错了,应该是两个函数 clean_virtual_name 和 clean_virtual_name , 太久没用 form 这玩意。
    看下 https://docs.djangoproject.com/en/3.0/ref/forms/validation/这一章

  • 資深大佬 : izzy27

    Form 不要选__all__,把 virtual_name 和 virtual_ip 这两个字段排除掉,这样就不会校验这两个字段了
    在你对应的 view 视图里面计算出正确的 virtual_name 和 virtual_ip 就行了

  • 主 資深大佬 : fanne

    @izzy27 #3 这个方法试过,但在最后的 virtual_form.save()这里,还是要把计算出的 virtual_name,virtual_ip 两个字塞回
    virtual_form,否则数据也无法保存起来。现在不知道怎么塞进去。

  • 主 資深大佬 : fanne

    @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’^(13d|14[5|7]|15d|166|17[3|6|7]|18d)d{8}$’,mobile):
    return mobile
    else:
    raise forms.ValidationError(u”手机号码非法”,code=’mobile invalid’)
    “`

    是不是类似这种的,可以对某些字段重新赋值,类似 return mobile,就可以把 mobile 字段重新赋值一个,然后返回所需要的 form,传递给 views

  • 資深大佬 : izzy27

    那你试一下在你的 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

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具