从view.py导入变量后。表格中没有下拉列表

时间:2017-07-18 10:18:45

标签: python django django-forms django-views

我在表单中使用Django表单我需要一个名为'layer_id'的views.py中的变量。所以我明白了

   self.form = labelModelForm(layer_id=self.layer.id)

并在forms.py中使用

class labelModelForm(forms.ModelForm):
    model = Labels_tool_
    def __init__(self, *args , **kwargs):
        layer_id = kwargs['layer_id']
        apn= forms.ModelChoiceField(queryset=Field.objects.filter(layer=layer_id).values_list('name', flat=True) ,empty_label="(Choose field)")

所以现在当我运行程序时,没有下拉列表出现。哪里错了?正如我所获得的layer_id在view.py

中的形式是正确的
My View.py file is 
 def ImportLabelView(self):
    urlItems =self.request.path.split('/')
    i = urlItems.index('layers')
    self.form = labelModelForm(layer_id=self.layer.id)
    if self.request.method == 'POST':
        self.layer = Layer.objects.filter(id=urlItems[i + 1],map=self.map.id).first()
        layerid= self.layer.id
        labmapid=self.map.id
        OwnerName = self.request.POST.get('owner_name')
        MailingAddrOne = self.request.POST.get('mailing_addr_One')
        mailingaddrTwo = self.request.POST.get('mailing_addr_Two')
        ApN = self.request.POST.get('apn')
        situsaddrTwo = self.request.POST.get('situs_addr_Two')
        situsaddrOne = self.request.POST.get('situs_addr_One')
        if Labels_tool_.objects.filter(map_id_labels=labmapid ,layer_id_labels=layerid).exists():
            Labels_tool_.apn = Labels_tool_.objects.filter(map_id_labels = labmapid , layer_id_labels = layerid).update(apn=ApN)
            Labels_tool_.owner_name = Labels_tool_.objects.filter(map_id_labels=labmapid, layer_id_labels=layerid).update(owner_name=OwnerName)
            Labels_tool_.mailing_addr_One = Labels_tool_.objects.filter(map_id_labels=labmapid,
                                                                     layer_id_labels=layerid).update(mailing_addr_One=MailingAddrOne)
            Labels_tool_.mailing_addr_Two = Labels_tool_.objects.filter(map_id_labels=labmapid,
                                                                     layer_id_labels=layerid).update(mailing_addr_Two=mailingaddrTwo)
            Labels_tool_.situs_addr_One = Labels_tool_.objects.filter(map_id_labels=labmapid, layer_id_labels=layerid).update(situs_addr_One=situsaddrOne)
            Labels_tool_.situs_addr_Two = Labels_tool_.objects.filter(map_id_labels=labmapid, layer_id_labels=layerid).update(situs_addr_Two=situsaddrTwo)
        else:
            labels_tool = Labels_tool_()
            labels_tool.apn             = self.request.POST.get('apn')
            labels_tool.owner_name      = self.request.POST.get('owner_name')
            labels_tool.mailing_addr_One= self.request.POST.get('mailing_addr_One')
            labels_tool.mailing_addr_Two= self.request.POST.get('mailing_addr_Two')
            labels_tool.situs_addr_One  = self.request.POST.get('situs_addr_One')
            labels_tool.situs_addr_Two  = self.request.POST.get('situs_addr_Two')
            labels_tool.map_id_labels   = self.map.id
            labels_tool.layer_id_labels  = self.layer.id
            labels_tool.save()
            # self.form = self.layer.form(self.request.POST)

        return self.redirect('mapport.maps.layers.importlabel', self.map.id, self.layer.id)
    return self.render('mapport/maps/layers/Labels_detail.html')

模板文件是

<form action="" method="post" id="label_form">{% csrf_token %}
 <div id="field1"><p id="apn_text">APN: </p>   {{ form.apn}}</div>

模型就像

class pdftabel_tool_(models.Model):

   apn = models.CharField(null=True, blank=False, max_length=255)

现在我错误地认为view.py中的值是正确的但是不显示下拉列表?

1 个答案:

答案 0 :(得分:1)

您需要设置self.fields,而不是self.initial

您应该在类级别以正常方式定义字段,然后在init方法中修改查询集。

class labelModelForm(forms.ModelForm):
    apn = forms.ModelChoiceField(queryset=Field.objects.none())

    def __init__(self, *args, **kwargs):
        layer_id = kwargs.pop('layer_id', None)
        super(labelModelForm, self).__init__(*args, **kwargs)
        self.fields['apn'].queryset = Field.objects.filter(layer=layer_id)