从视图导入数据后如何将下拉数据分配给字段
How to assign dropdown data to a field after importing data from view
我正在 forms.py 中创建一个下拉列表并过滤数据,我得到一个名为 layer_id
的变量。并像这样进入视野 layer_id = kwargs['layer_id']
。一切都很好,但是当我最终分配给这样的文件时 self.fields['apn'].queryset= Field.objects.filter(layer=layer)
。调用转到数据库的 fields
table,而不是分配我在 forms.py 中声明的这些字段。那么我可以将谁分配给 forms.py
中的字段
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=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)
def __init__(self, *args, **kwargs):
layer_id = kwargs.pop('layer_id', None)
super(labelModelForm, self).__init__(*args, **kwargs)
layer=Layer.objects.filter(id=layer_id).first()
x=Field.objects.filter(layer=layer)
self.fields['apn'].queryset= Field.objects.filter(layer=layer)
希望对您有所帮助
将您的表单更改为
class labelModelForm(forms.ModelForm):
apn = forms.ModelChoiceField(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']
如果你想将一些变量形成实例,你可以使用get_form_kwargs
方法。
你可以在 __init__
.
中使用它
#views.py
class ExampleRegisterView(CreateView):
model = ExampleModel
form_class = RegisterExampleForm
template_name = 'example.html'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['layer_id'] = 12 # for example, I give 12.
return kwargs
#forms.py
class RegisterExampleForm(forms.ModelForm):
apn = forms.ChoiceField(label="test")
class Meta:
model = ExampleModel
fields = ['yourfield', ]
def __init__(self, *args, **kwargs):
layer_id = kwargs.pop('layer_id', None)
super().__init__(*args, **kwargs)
if layer_id:
layer = Layer.objects.get(id=layer_id).first()
self.fields['apn'].choices = Field.objects.filter(layer=layer)
我正在 forms.py 中创建一个下拉列表并过滤数据,我得到一个名为 layer_id
的变量。并像这样进入视野 layer_id = kwargs['layer_id']
。一切都很好,但是当我最终分配给这样的文件时 self.fields['apn'].queryset= Field.objects.filter(layer=layer)
。调用转到数据库的 fields
table,而不是分配我在 forms.py 中声明的这些字段。那么我可以将谁分配给 forms.py
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=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)
def __init__(self, *args, **kwargs):
layer_id = kwargs.pop('layer_id', None)
super(labelModelForm, self).__init__(*args, **kwargs)
layer=Layer.objects.filter(id=layer_id).first()
x=Field.objects.filter(layer=layer)
self.fields['apn'].queryset= Field.objects.filter(layer=layer)
希望对您有所帮助
将您的表单更改为
class labelModelForm(forms.ModelForm):
apn = forms.ModelChoiceField(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']
如果你想将一些变量形成实例,你可以使用get_form_kwargs
方法。
你可以在 __init__
.
#views.py
class ExampleRegisterView(CreateView):
model = ExampleModel
form_class = RegisterExampleForm
template_name = 'example.html'
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['layer_id'] = 12 # for example, I give 12.
return kwargs
#forms.py
class RegisterExampleForm(forms.ModelForm):
apn = forms.ChoiceField(label="test")
class Meta:
model = ExampleModel
fields = ['yourfield', ]
def __init__(self, *args, **kwargs):
layer_id = kwargs.pop('layer_id', None)
super().__init__(*args, **kwargs)
if layer_id:
layer = Layer.objects.get(id=layer_id).first()
self.fields['apn'].choices = Field.objects.filter(layer=layer)