Django 动态表单 - 动态选择字段

0 投票
2 回答
1202 浏览
提问于 2025-04-18 13:34

在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())

撰写回答