django-forms länge - Wie aktualisiert man ein Objekt vom Bearbeitungsformular in Django?




meta title (3)

Update für Django 1.6 und weitere Version

# forms.py
# ...
class MyForm(forms.ModelForm):

     class Meta:
     model = MyModel

# views.py  

def my_view(request, id): 
    instance = MyModel.objects.get(id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
          form.save()
          return redirect('next_view')
return direct_to_template(request, 'my_template.html', {'form': form})  

Möglicherweise eine neue Frage, also bitte, bitte mit mir.

Ich habe ein Django-Formular, das eine bestimmte Instanz eines Modells bearbeitet. Um zu wissen, welches Objekt bearbeitet wird, habe ich ein verstecktes Feld, das die ID des Objekts zusammen mit der URL enthält, die die ID enthält.

Erste Frage : Ist die ID des Objekts in einem versteckten Feld der richtige Weg?

Meine (möglicherweise unbegründete) Sorge, es nur als Teil der URL zu haben, besteht darin, dass jemand dann die Seite einer Objekt-ID öffnen, das Formular an eine andere übergeben kann und dieses Objekt dann überschrieben wird. Deshalb versuche ich ein verstecktes Feld zu benutzen.

Das Problem beim Speichern der ID in einem versteckten Feld besteht darin, dass Django bei der Validierung des Formulars beklagt, dass das Objekt (offensichtlich) keine eindeutige ID hat.

Zweite Frage : Wenn ein eindeutiges Feld Teil eines Formulars ist, wie sagt man Django, dass es die Tatsache ignoriert, dass dieser Schlüssel bereits existiert, um das Objekt zu aktualisieren?


Warum benutzt du nicht einfach ModelForm?

# forms.py
# ...
class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel

# views.py
# ...    
def my_view(request, id): 
    instance = get_object_or_404(MyModel, id=id)
    form = MyForm(request.POST or None, instance=instance)
    if form.is_valid():
        form.save()
        return redirect('next_view')
    return render(request, 'my_template.html', {'form': form}) 

Sie können -v 2 an den test :

python manage.py test -v 2

Nachdem Sie diesen Befehl ausgeführt haben, erhalten Sie so etwas (ich verwende django 2, Sie können Migrationen / Datenbanksachen einfach ignorieren):

Creating test database for alias 'default' ('file:memorydb_default?mode=memory&cache=shared')...
Operations to perform:
  Synchronize unmigrated apps: messages, staticfiles
  Apply all migrations: admin, auth, contenttypes, sessions
Synchronizing apps without migrations:
  Creating tables...
   Running deferred SQL...
Running migrations:
  Applying contenttypes.0001_initial... OK
  ...
  Applying sessions.0001_initial... OK
System check identified no issues (0 silenced).
test_equal_hard (polls.tests.TestHard) ... ok      <--------+
test_equal_simple (polls.tests.TestSimple) ... ok  <--------+
                                                            |
                                                            |
           That's your tests!  >----------------------------+

Übrigens steht v für Verbosity (Sie können auch --verbosity=2 ):

python manage.py test --verbosity=2

Hier ist der Auszug aus dem python manage.py test --help :

-v {0,1,2,3}, --verbosity {0,1,2,3}

Ausführlichkeitsstufe; 0 = minimale Ausgabe, 1 = normale Ausgabe, 2 = ausführliche Ausgabe, 3 = sehr ausführliche Ausgabe







django django-forms