Если вас это устраивает, все это проще всего сделать с помощью javascript. Создать обработчики для создания / редактирования / удаления. Create создает пустую форму для GET и проверяет / сохраняет для POST, добавляя новый элемент в продажу, к которой он должен принадлежать. Редактировать / Удалить должно следовать довольно очевидно.
Я бы, вероятно, просто заставил бы обработчики отображать партиалы 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.