Django嵌入了ManyToMany表单

时间:2011-02-17 23:47:32

标签: django forms admin

我需要一个特殊的部分到一个表格,我无法想象现在怎么做。我会尽力让自己清楚。

假设我有一个像“Sale”这样的模型。这自然是一套正在销售的产品。我不想选择ManyToMany上的产品,我只想拥有两个CharFields,如“Name”和“Price”,另外还有一个“Add”按钮。当我填写这些字段并按“添加”时,会有一个ajax操作,将一行放入它们正下方的框中。如果我想通过单击此行中的“删除”按钮来删除其中一行,也是一样。

这基本上是一个ManyToMany字段,我可以“在运行中”插入它们。

我也完全接受其他解决方案。 感谢。

1 个答案:

答案 0 :(得分:1)

如果它适合你,整个事情可以通过javascript轻松完成。创建用于创建/编辑/删除的处理程序。创建为GET呈现空白表单并验证/保存POST,将新项目添加到它应该属于的Sale。编辑/删除应该非常明显。

我可能只是让处理程序渲染html部分,使用javascript将html拉入dom进行GET并使用POST将数据更改为服务器。

假设模型,

class Sale(models.Model):
  items = models.ManyToMany('Item', related_name='sales')
  # ...

class Item(models.Model):
  # ...

然后我们可以创建一些像这样的处理程序:

def create_item(request, saleID=""):
  sale = get_object_or_404(Sale, <ID>=saleID) # <- get the sale obj

  if request.method == 'POST':
    form = ItemForm(request.POST) # <- could take the sale here and do .add() in the save()
    if form.is_valid():
      i = form.save()
      sale.items.add(i) # <- or, add in the view here
      if request.is_ajax():
        return HttpResponse('ok')
      # redirect with messages or what have you if not ajax
  else:
    # make a blank form and whatnot
  # render the form

def edit_item(request, id|pk|slug=None):
  item = get_object_or_404(Item, slug=slug)
  if request.method == 'POST':
    # do the form is_valid, form save, return 'ok' if ajax, redirect if not ajax
  else:
    form = EditForm(instance=item)
  # render the form

def delete_item(request, id|pk|slug=None):
  if request.method == 'POST':
    # delete the item and redirect, or just return "ok" if is_ajax
  # render confirmation dialog

对于前端代码,我会使用http://api.jquery.com/load/ http://api.jquery.com/jQuery.get/和http://api.jquery.com/jQuery.post/等的某种组合,但任何javascript框架都可以。