Django使用AJAX调用向模型表单添加单个字段
我有一个模型表单。这个表单里有一个按钮,叫“添加更多字段”。点击这个按钮会发送一个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" />