最性感的解决方案
您可以使用此处描述的 jquery 自动完成工具之一:Facebook style JQuery autocomplete plugin
然后是形式:
class ToolBoxEditForm (ModelForm):
tools = forms.CharField(widget=forms.Textarea, required=False)
def clean_tools(self):
tool_data = self.cleaned_data.get('tools',None)
tools = []
#here, a comma is used a delim, so it's not allowed in the tool name.
for td in tool_data.split(','):
t, _ = Tool.objects.get_or_create(name=td)
tools.append(t)
return tools
class Meta:
model = ToolBox
exclude = ('user', 'popularity',)
您必须弄清楚如何修改 JavaScript 以便可以输入新项目(即不仅仅是数据库中已有的项目)。
替代解决方案
这就是 inline formsets 的创建目的,所以 Narendra's solution 可以工作。
类似:
from django.forms.models import inlineformset_factory
def manage_toolbox(request, toolbox_id):
toolbox = Toolbox.objects.get(pk=toolbox_id)
ToolInlineFormSet = inlineformset_factory(Toolbox, Tool)
if request.method == "POST":
formset = ToolInlineFormSet(request.POST, request.FILES, instance=toolbox)
if formset.is_valid():
formset.save()
# Do something.
else:
formset = ToolInlineFormSet(instance=toolbox)
return render_to_response("manage_toolbox.html", {
"formset": formset,
})
并不是说此表单仅用于编辑工具箱中的项目。如果您希望用户能够编辑工具箱的其他方面(例如,它的名称或描述),您可以创建一个单独的表单并将它们都输出到相同的 <form></form> 标记中。