我需要一个特殊的部分到一个表格,我无法想象现在怎么做。我会尽力让自己清楚。
假设我有一个像“Sale”这样的模型。这自然是一套正在销售的产品。我不想选择ManyToMany上的产品,我只想拥有两个CharFields,如“Name”和“Price”,另外还有一个“Add”按钮。当我填写这些字段并按“添加”时,会有一个ajax操作,将一行放入它们正下方的框中。如果我想通过单击此行中的“删除”按钮来删除其中一行,也是一样。
这基本上是一个ManyToMany字段,我可以“在运行中”插入它们。
我也完全接受其他解决方案。 感谢。
答案 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框架都可以。