首页 > 自动化运维 > Django > django form select 获取数据库值的问题
2018
01-25

django form select 获取数据库值的问题

最近在用 Django 开发资产管理系统的时候发现一个问题,在使用 form 修改表单的时候,模板中不能直接获取select在数据库中值,这里分享下解决方法

项目代码环境:

使用djanog form 校验数据,前端使用django 模板

host_edit.html(django 模板语言

{{ uf.node_name|bootstrap_horizontal }}

<div class="hr-line-dashed"></div>
{{ uf.eth1|bootstrap_horizontal }}

<div class="hr-line-dashed"></div>
{{ uf.eth2|bootstrap_horizontal }}

<div class="hr-line-dashed"></div>
{{ uf.eth3|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
{{ uf.vip|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
{{ uf.status|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
{{ uf.idc|bootstrap_horizontal }}
<div class="hr-line-dashed"></div>
{{ uf.system|bootstrap_horizontal }}

model.py (idc 外键)

class Host(models.Model):
    uuid = UUIDField(auto=True, primary_key=True)
    node_name = models.CharField(max_length=100, blank=True, null=True, verbose_name=u"主机名")
    idc = models.ForeignKey(IDC, blank=True, null=True, verbose_name=u'机房', on_delete=models.SET_NULL

class IDC(models.Model):
    uuid = UUIDField(auto=True, primary_key=True)
    name = models.CharField(max_length=64, unique=True,verbose_name=u'机房名称')

form.py

class HostForm(forms.ModelForm):
    class Meta:
        model = Host
        fields = ["node_name", 'idc',"system","eth1", "eth2", "eth3", "business", "service", "status",
                  "cpu", "hard_disk", "memory", "vm", "idle", "editor", "vip", "isp", "port"]

view.py(简单代码如下

def host_edit(request):
    uuid = request.GET.get('uuid')
    host = get_object_or_404(Host, uuid=uuid)
    uf = HostForm(instance=host)
    return render_to_response('assets/host_edit.html', locals(), context_instance=RequestContext(request))
    if request.method == 'POST':
  
        uf_post = HostForm(request.POST, instance=host)
        if uf_post.is_valid():
            zw = uf_post.save()
            zw.save()

此时通过在编辑修改主机的时候不能获取外键的值显示的是 —- ,

blob.png

解决办法:

修改form 重新初始化idc和System字段

class HostForm(forms.ModelForm):
    class Meta:
        model = Host
        fields = ["node_name", 'idc',"system","eth1", "eth2", "eth3", "business", "service", "status",
                  "cpu", "hard_disk", "memory", "vm", "idle", "editor", "vip", "isp", "port"]

    def __init__(self,*args,**kwargs):
        super(HostForm,self).__init__(*args,**kwargs)
        self.fields['idc'].choices=[(doc.uuid,doc.name) for doc in IDC.objects.all()]
        self.fields['system'].choices=[(doc.uuid,doc.name) for doc in System.objects.all()]

访问测试发现去掉了—-

blob.png

但是显示的值是不对的,我们这个机器属于zwt但这里显示的ccp,说明这个值没有从数据库中获取到。继续

修改view代码,自定义hostform的值

def host_edit(request):
    uuid = request.GET.get('uuid')
    host = get_object_or_404(Host, uuid=uuid)
    uf = HostForm({
    "node_name":host.node_name,
    "idc": host.idc.uuid,
    "eth1":host.eth1,
    "eth2":host.eth2,
    "eth3":host.eth3,
    "vip":host.vip,
    "status":host.status,
    "port":host.port,
    "editor":host.editor,
    "system":host.system.uuid,
})
    return render_to_response('assets/host_edit.html', locals(), context_instance=RequestContext(request))
    if request.method == 'POST':
  
        uf_post = HostForm(request.POST, instance=host)
        if uf_post.is_valid():
            zw = uf_post.save()
            zw.save()

这里获取外键的时候需要注意下 写法是 

"idc": host.idc.uuid,




最后编辑:
作者:tshare365
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复