Django 动态表单 - 动态选择字段
在Django中,我该如何创建一个可选择的表单字段,以便每次调用时都能从数据库中获取数据?现在这行代码:status = forms.ChoiceField(choices=FormsTools.StatusesToTuples(Status.objects.all()))
只在Django加载时执行一次,而不是每次显示表单时都执行。我要怎么让这个字段变得动态?这样每次显示表单时,可选择的字段就能从数据库中获取最新的值。
更新:
POST数据:
.
status: u'4'
.
.
在模型中,这个字段看起来是这样的:status = models.IntegerField()
视图:
def edit_call(request, call_id):
c = Call.objects.get(id=call_id)
if request.POST:
form = CallForm(request.POST, instance=c)
print form.errors
if form.is_valid():
form.save()
return HttpResponseRedirect('/ViewCalls/')
else:
form = CallForm(instance=c)
args = {}
args.update(csrf(request))
args["form"] = form
args["id"] = call_id
t = get_template('edit_call.html')
cont = RequestContext(request, args)
html = t.render(cont)
return HttpResponse(html)
表单:
简单来说是:
class CallForm (forms.ModelForm):
employee_id = forms.ModelChoiceField(queryset=Employee.objects.all())
status = forms.ModelChoiceField(queryset=Status.objects.all())
class Meta():
model = Call
2 个回答
0
你有没有看过 forms.ModelChoiceField 呢?
更新后的回答,针对更新的问题:
现在你需要让你的模型和表单匹配:
你的模型里有一个整数字段(IntegerField),而你的表单里有一个模型选择字段(ModelChoiceField)。后者返回的是一个主键字符串,而不是整数ID。
既然你在使用模型表单,为什么不让它帮你自动创建字段呢?
class CallForm(forms.ModelForm):
class Meta:
model = Call
fields = ('employee', 'status') # assuming these are what the field names are
2
每次你加载表单的时候,都需要调用构造函数来更新选项。所以表单应该是这样的:
class CallForm(forms.ModelForm):
...
status = forms.ChoiceField()
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False):
super(CallForm, self).__init__(data, files, auto_id, prefix, initial, error_class,
label_suffix, empty_permitted)
self.fields['status'].choices = FormsTools.StatusesToTuples(Status.objects.all())