webentwicklung-frage-antwort-db.com.de

Erstmalige Besiedlung auf Django-Formularen

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?

20
diehell

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.

20
ars

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)
8
S.Lott

nur ändern

data = {'title':'{{game.title}}','genre':'{{game.genre}}'} 
form(data) 

zu

data = {'title':'{{game.title}}','genre':'{{game.genre}}'} 
form(initial=data) 
3
Jiaaro

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
2
SaeX

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

1
Fred Sousa

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.

0
Waqas

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