fields - Poblado inicial en Django Forms
label django form (7)
¿Podrías intentar el siguiente?
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})
funciona bien para mí en Django 1.8
Decidí aprender Django Forms. Desde hace un tiempo, he estado utilizando formularios HTML porque me cuesta llegar a un acuerdo con Django Forms.
¿Cómo podría rellenar los datos iniciales de Django Forms? Ejemplo:
Considere si estos modelos están poblados. Contener datos
modelos.py
class Game(models.Model):
title = models.CharField()
genre = models.CharField()
así que si tengo
ver.py
game_list = Game.objects.all()
return render_to_response(''template'',locals())
así que en template.html , podría simplemente:
{% for game in game_list %}
<p> game.title <p> <br /> <p> game.genre <p>
Si quiero rellenar los datos iniciales al usar formularios HTML , esto es lo que normalmente hago:
{% 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" />
¿Cómo puedo hacer esto en Django Forms? Por lo que he visto al leer artículos en línea, lo hacen anulando el uso de forms.__init__
:
class Anyforms(forms.Form):
super(Anyforms, self).__init__(*args,**kwargs)
No puedo entender cómo poblar usando super
. ¿Qué datos obtienen los formularios durante el tiempo de ejecución y cómo? ¿Algún buen enlace que pudiera leer para ponerme en marcha en la gestión de Django Forms?
Es esto
<input="text" name="title" value="{{game.title}}" />
<input="text" name="genre" value="{{game.genre}}" />
equivalente a esto?
data = {''title'':''{{game.title}}'',''genre'':''{{game.genre}}''}
form(data)
¿Se van a reemplazar las variables en plantilla?
Al usar los CBV, puede anular get_initial()
para completar los datos iniciales en el formulario. Ejemplo:
def get_initial(self):
initial = super(MyView, self).get_initial()
initial[''start_date''] = datetime.date.today()
return initial
Creo que esto funcionará también, pero no estoy seguro.
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})
Y en la vista puede hacer como form.field para mostrar el formulario con datos iniciales.
La respuesta de S. Lott le dice cómo inicializar el formulario con algunos datos en su vista. Para representar su formulario en una plantilla, consulte la siguiente sección de la documentación de django que contiene varios ejemplos:
Aunque los ejemplos muestran que el renderizado funciona desde un intérprete de Python, es lo mismo cuando se realiza en una plantilla.
Por ejemplo, en lugar de print f
, su plantilla simplemente contendría: {{ f }}
suponiendo que pase su formulario a través del contexto como f
. De manera similar, f.as_p()
se escribe en la plantilla como {{ f.as_p }}
. Esto se describe en los documentos de la plantilla de django en la sección Variables .
Actualización (respondiendo a los comentarios)
No exactamente, la notación de la plantilla es sólo para la plantilla . Su formulario y los datos asociados se inicializan en la vista .
Entonces, usando tu ejemplo, tu vista contendría algo como:
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})
Entonces tu plantilla tendría algo como:
{{ form }}
O si desea personalizar el HTML usted mismo:
{{ form.title }} <br />
{{ form.genre }} <br />
y así.
Recomiendo probarlo y experimentar un poco. Luego haz una pregunta si encuentras un problema.
Puede pasar la instancia directamente si establece el atributo de modelo en la clase de formulario
class GameForm(forms.Form):
class Meta:
model = Game
En su opinión:
def view(request):
game = Game.objects.get(id=1)
form = GameForm(instance=game)
return render(request, ''template.html'', {''form'': form})
Funciona para mí en Django 2.1
solo cambia
data = {''title'':''{{game.title}}'',''genre'':''{{game.genre}}''}
form(data)
a
data = {''title'':''{{game.title}}'',''genre'':''{{game.genre}}''}
form(initial=data)
http://docs.djangoproject.com/en/1.2/ref/forms/api/#ref-forms-api-bound-unbound
Para enlazar datos a un formulario, pase los datos como un diccionario como primer parámetro a su clase de constructor:
>>> data = {''subject'': ''hello'',
... ''message'': ''Hi there'',
... ''sender'': ''[email protected]'',
... ''cc_myself'': True}
>>> f = ContactForm(data)