我从视图中获取变量,然后像以后一样在函数中修改
class labelModelForm(forms.ModelForm):
model = Labels_tool_
fields = ['apn', 'owner_name', 'situs_addr_One', 'situs_addr_Two', 'mailing_addr_One', 'mailing_addr_Two']
apn = forms.ModelChoiceField(queryset=Field.objects.values_list('name', flat=True), empty_label="(Choose field)")
def __init__(self, *args, **kwargs):
//getting layer_id from views
layer_id = kwargs['layer_id']
print layer_id
layer=Layer.objects.filter(id=int(str(layer_id))).first()
x=Field.objects.filter(layer=layer)
//On this step when modify queryset I get error
self.fields['apn'].queryset= Field.objects.filter(layer=layer)
当我这样做时,我得到错误'列表索引必须是整数,而不是str' 。那么如何修改我的查询集呢?
model.py
class Labels_tool_(models.Model):
map_id_labels = models.IntegerField(null=True, blank=False, max_length=255)
apn = models.CharField(null=True, blank=False, max_length=255)
owner_name = models.CharField(null=True, blank=False, max_length=255)
situs_addr_One = models.CharField(null=True, blank=False, max_length=255)
situs_addr_Two = models.CharField(null=True, blank=False, max_length=255)
mailing_addr_One = models.CharField(null=True, blank=False, max_length=255)
mailing_addr_Two = models.CharField(null=True, blank=False, max_length=255)
layer_id_labels = models.IntegerField(null=True, max_length=255)
Model of Field
class Field(models.Model):
TYPE_CHOICES = (
('date', 'Date'),
('datetime', 'Date + Time'),
('number', 'Decimal'),
('url', 'Hyperlink'),
('integer', 'Integer'),
('string', 'Text Line'),
('text', 'Text Block')
)
class Meta:
db_table = 'fields'
ordering = ['map_order']
layer = models.ForeignKey(Layer)
name = models.CharField(max_length=255)
sql_name = models.CharField(max_length=255)
编辑:错误在self.fields['apn'].queryset= Field.objects.filter(layer=layer)
。因为我有这样的字段fields = ['apn', 'owner_name', 'situs_addr_One', 'situs_addr_Two', 'mailing_addr_One', 'mailing_addr_Two']
。这就是为什么列表出现错误的原因。那么我该如何解决这个问题呢?
答案 0 :(得分:0)
尝试更改您的表单,
class labelModelForm(forms.ModelForm):
apn = forms.ModelChoiceField(queryset=Field.objects.values_list('name', flat=True), empty_label="(Choose field)")
class Meta:
model = Labels_tool_
fields = ['apn', 'owner_name', 'situs_addr_One', 'situs_addr_Two', 'mailing_addr_One', 'mailing_addr_Two']
def __init__(self, *args, **kwargs):
super(labelModelForm, self).__init__(*args, **kwargs)
layer_id = kwargs['layer_id']
self.fields['apn'].queryset= Field.objects.filter(layer__id=int(layer_id)).values_list('name', flat=True)