2 Stimmen

Django eingebettetes ManyToMany-Formular

Ich brauche einen speziellen Abschnitt in ein Formular, den ich mir im Moment nicht vorstellen kann, wie ich das machen soll. Ich werde versuchen, mich klar auszudrücken.

Angenommen, ich habe ein Modell namens "Sale". Das ist natürlich eine Reihe von Produkten, die verkauft werden. Ich möchte die Produkte nicht wie bei ManyToMany auswählen, sondern einfach zwei CharFields wie "Name" und "Preis" haben, und einen "Hinzufügen"-Button direkt daneben. Wenn ich diese Felder ausfülle und auf "Hinzufügen" drücke, wird eine AJAX-Aktion ausgeführt, die eine Zeile unter ihnen in eine Box einfügt. Das Gleiche, wenn ich eine der Zeilen entfernen möchte, indem ich auf den "Entfernen"-Button in dieser Zeile klicke.

Das ist im Grunde genommen ein ManyToMany-Feld in der Weise, dass ich sie "im Flug" einfügen kann.

Ich bin auch völlig offen für andere Lösungen. Vielen Dank.

1voto

Skylar Saveland Punkte 10479

Wenn es Ihnen passt, könnte das Ganze am einfachsten mit JavaScript erledigt werden. Erstellen Sie Handler für Erstellen/Bearbeiten/Löschen. Erstellen rendert ein leeres Formular für ein GET und validiert/speichert für ein POST, indem das neue Element zum Verkauf hinzugefügt wird, dem es gehören sollte. Bearbeiten/Löschen sollte ziemlich offensichtlich folgen.

Ich würde wahrscheinlich die Handler einfach HTML-Partials rendern lassen, indem ich JavaScript benutze, um das HTML bei GET in den DOM zu ziehen und die Daten bei POSTs an den Server zu übermitteln.

Annehmend die Modelle,

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

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

Dann könnten wir einige Handler wie diese erstellen:

def create_item(request, saleID=""):
  sale = get_object_or_404(Sale, =saleID) # <- holen Sie das Sale-Objekt

  if request.method == 'POST':
    form = ItemForm(request.POST) # <- könnte hier den Sale nehmen und .add() in save() machen
    if form.is_valid():
      i = form.save()
      sale.items.add(i) # <- oder hier im View hinzufügen
      if request.is_ajax():
        return HttpResponse('ok')
      # umleiten mit Nachrichten oder was auch immer, wenn nicht ajax
  else:
    # ein leeres Formular erstellen und so weiter
  # das Formular rendern

def edit_item(request, id|pk|slug=None):
  item = get_object_or_404(Item, slug=slug)
  if request.method == 'POST':
    # das Formular überprüfen, speichern, 'ok' zurückgeben, wenn ajax, umleiten, wenn nicht ajax
  else:
    form = EditForm(instance=item)
  # das Formular rendern

def delete_item(request, id|pk|slug=None):
  if request.method == 'POST':
    # das Element löschen und umleiten oder einfach "ok" zurückgeben, wenn is_ajax
  # Dialog zur Bestätigung rendern

Für den Frontend-Code würde ich eine Kombination von http://api.jquery.com/load/, http://api.jquery.com/jQuery.get/ und http://api.jquery.com/jQuery.post/ verwenden, etc aber jedes JavaScript-Framework wird funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X