Django使用AJAX调用向模型表单添加单个字段

0 投票
1 回答
598 浏览
提问于 2025-04-17 10:05

我有一个模型表单。这个表单里有一个按钮,叫“添加更多字段”。点击这个按钮会发送一个AJAX请求,应该会在表单中添加一个文本框。可以添加任意数量的“文本框”。

我不太确定使用Django的表单集(Formsets)是否合适,因为我需要把“额外添加的字段”的数据存储在同一个模型表单的数据库表里。

我该怎么做呢?

1 个回答

1

我最近做了类似的事情,我的解决办法是动态地创建一个表单的子类,只提供需要的字段,并且只渲染那个字段:

from forms import SomeModelForm
from models import SomeModel
def view_name(request,pk,field):
    SomeModelFieldForm(SomeModelForm):
        class Meta(SomeModelForm.Meta):
            fields = (field,)

    inst = SomeModel.objects.get(pk=pk)
    form = SomeModelFieldForm(instance=inst)

    #the rest of your view goes here...

    #...send only the form's field:
    ctx = {'field': form[field]}
    return render_to_response("template",ctx)

这样做是利用了你原始表单的特点,比如说,如果你有特别定义的小部件,或者其他限制条件,或者其他东西。然后它把整个表单限制为只有一个字段。这是为了验证一个已经存在的模型中的单个字段。

不过,你不想发送整个表单,你只想发送那个单独的字段。form[field] 是一个 django.forms.forms.BoundField,它代表你传入的特定字段。

举个例子,如果你在使用 django.contrib.auth.models 中的 User 模型,并且你为特定用户创建了一个表单,那么在空闲时调用 form["username"] 会返回:

<django.forms.forms.BoundField object at 0x01354750>

而调用 print form["username"] 会打印出:

<input id="id_username" type="text" name="username" value="name_of_user" maxlength="30" />

撰写回答