Django встроил форму ManyToMany - PullRequest
2 голосов
/ 18 февраля 2011

Мне нужен специальный раздел в форме, который я не могу себе представить, как это сделать сейчас.Я постараюсь прояснить ситуацию.

Предположим, у меня есть модель типа "Распродажа".Это, естественно, набор продаваемых продуктов.Я не хочу выбирать продукты, как на ManyToMany, я просто хочу иметь два поля CharField, такие как «Имя» и «Цена», и кнопку «Добавить», кроме того.Когда я заполню эти поля и нажму «Добавить», будет действие ajax, которое поместит строку в поле чуть ниже их.То же самое, если я хочу удалить одну из строк, нажав кнопку «Удалить» в этой строке.

Это в основном поле ManyToMany таким образом, что я могу вставлять их «на лету».

Я полностью открыт и для других решений.Спасибо.

1 Ответ

1 голос
/ 18 февраля 2011

Если вас это устраивает, все это проще всего сделать с помощью 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.

...