【发布时间】:2012-02-08 17:50:33
【问题描述】:
我有一个模型表单。该表单包含一个“添加更多字段”按钮。单击此按钮会发送一个 AJAX 调用,该调用应向表单添加一个文本字段。可以添加任意数量的“文本字段”。
我不确定 Django-Formsets 是否是正确的方法,因为我需要将“额外添加的字段”的数据存储在数据库的同一模型表单的表中。
我怎样才能做到这一点?
【问题讨论】:
标签: python ajax django django-models django-forms
我有一个模型表单。该表单包含一个“添加更多字段”按钮。单击此按钮会发送一个 AJAX 调用,该调用应向表单添加一个文本字段。可以添加任意数量的“文本字段”。
我不确定 Django-Formsets 是否是正确的方法,因为我需要将“额外添加的字段”的数据存储在数据库的同一模型表单的表中。
我怎样才能做到这一点?
【问题讨论】:
标签: python ajax django django-models django-forms
我最近做了类似的事情,我的解决方案是动态子类化表单,只提供需要的字段,然后只渲染那个字段:
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" />
【讨论】: