当我显示ToolBoxEditForm时,它使用多个选择字段.
但我想要的是一个表单,让用户可以将工具箱中的每个工具编辑为文本字段.我无法弄清楚如何使用多对多字段来完成此操作.
class Tool(models.Model):
tool_name = models.CharField(unique=True, max_length=200)
......
class ToolBox(models.Model):
tools = models.ManyToManyField(Tool,max_length=300)
class ToolBoxEditForm (ModelForm):
tools = ???
class Meta:
model = ToolBox
exclude = ('user', 'popularity',)
最佳答案 最性感的解决方案
您可以使用此处描述的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>内输出它们.标签.