Ich entschied mich, Django Forms zu lernen. Seit einiger Zeit verwende ich HTML-Formulare, da ich mich mit Django Forms nur schwer zurechtfinden kann.
Wie kann ich Django Forms mit Anfangsdaten füllen? Beispiel:
Überlegen Sie, ob diese Modelle gefüllt sind. Daten enthalten.
models.py
class Game(models.Model):
title = models.CharField()
genre = models.CharField()
also wenn ich habe
view.py
game_list = Game.objects.all()
return render_to_response('template',locals())
also in template.html könnte ich einfach:
{% for game in game_list %}
<p> game.title <p> <br /> <p> game.genre <p>
Wenn ich bei der Verwendung von HTML-Formularen anfängliche Daten auffüllen möchte, mache ich das normalerweise:
{% for game in game_list %}
<form action= '/add/' method='POST'>
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
<input type="submit" />
Wie mache ich das in Django-Formularen? Nach dem Lesen von Artikeln im Internet haben sie dies mit forms.__init__
überschrieben:
class Anyforms(forms.Form):
super(Anyforms, self).__init__(*args,**kwargs)
Ich kann nicht verstehen, wie ich mit super
auffüllen kann. Welche Daten erhalten Formulare zur Laufzeit und wie? Gibt es gute Links, die ich lesen konnte, damit ich mit Django Forms umgehen kann?
Ist das
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
äquivalent zu diesem?
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
Werden die Variablen in der Vorlage ersetzt?
In der Antwort von S. Lott erfahren Sie, wie Sie das Formular mit einigen Daten in Ihrer Ansicht initialisieren. Informationen zum Rendern Ihres Formulars in einer Vorlage finden Sie im folgenden Abschnitt der Django-Dokumente, der eine Reihe von Beispielen enthält:
Obwohl die Beispiele zeigen, wie das Rendering von einem Python-Interpreter ausgeführt wird, ist es dasselbe, wenn es in einer Vorlage ausgeführt wird.
Anstelle von print f
würde Ihre Vorlage beispielsweise Folgendes enthalten: {{ f }}
, vorausgesetzt, Sie übergeben Ihr Formular als f
durch den Kontext. Ebenso wird f.as_p()
als {{ f.as_p }}
in die Vorlage geschrieben. Dies ist in den Django-Vorlagendokumenten unter Variables beschrieben.
Update (auf die Kommentare antworten)
Nicht genau, die Schablonennotation gilt nur für template . Ihr Formular und die dazugehörigen Daten werden in der Ansicht initialisiert.
In Ihrem Beispiel würde Ihre Ansicht also etwa Folgendes enthalten:
def view(request):
game = Game.objects.get(id=1) # just an example
data = {'id': game.id, 'position': game.position}
form = UserQueueForm(initial=data)
return render_to_response('my_template.html', {'form': form})
Dann hätte deine Vorlage so etwas wie:
{{ form }}
Oder wenn Sie den HTML-Code selbst anpassen möchten:
{{ form.title }} <br />
{{ form.genre }} <br />
und so weiter.
Ich empfehle, es auszuprobieren und ein wenig zu experimentieren. Dann stellen Sie eine Frage, wenn Sie auf ein Problem stoßen.
http://docs.djangoproject.com/de/1.2/ref/forms/api/#ref-forms-api-bound-unbound
Um Daten an ein Formular zu binden, übergeben Sie die Daten als ersten Parameter an Ihren Form-Klassenkonstruktor:
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': '[email protected]',
... 'cc_myself': True}
>>> f = ContactForm(data)
nur ändern
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(data)
zu
data = {'title':'{{game.title}}','genre':'{{game.genre}}'}
form(initial=data)
Wenn Sie CBVs verwenden, können Sie get_initial()
überschreiben, um die ursprünglichen Daten in das Formular einzufügen. Beispiel:
def get_initial(self):
initial = super(MyView, self).get_initial()
initial['start_date'] = datetime.date.today()
return initial
Könntest du folgendes probieren:
from Django.forms.models import model_to_dict
def view(request):
game = Game.objects.get(id=1)
form = UserQueueForm(initial=model_to_dict(game))
return render_to_response('my_template.html', {'form': form})
funktioniert gut für mich auf Django 1.8
Ich denke, das wird auch funktionieren, aber nicht sicher.
def view(request):
game = Game.objects.get(id=1) # just an example
form = UserQueueForm(instance=game)
return render_to_response('my_template.html', {'form': form})
In der Ansicht können Sie wie form.field das Formular mit den Anfangsdaten anzeigen.
Sie können die Instanz direkt übergeben, wenn Sie das Modellattribut für die Formularklasse festlegen
class GameForm(forms.Form):
class Meta:
model = Game
Ihrer Ansicht nach:
def view(request):
game = Game.objects.get(id=1)
form = GameForm(instance=game)
return render(request, 'template.html', {'form': form})
Arbeitet für mich an Django 2.1