2010-09-30 18 views
15

Decidí aprender Django Forms. Desde hace un tiempo, he estado usando formularios HTML porque es difícil para mí aceptar los formularios de Django.Poblar inicial en Django Forms

¿Cómo podría rellenar los datos iniciales en Django Forms? Ejemplo:

Considere si estos modelos están ocupados. Contener datos

models.py

class Game(models.Model): 
    title = models.CharField() 
    genre = models.CharField() 

lo que si tengo

view.py

game_list = Game.objects.all() 
return render_to_response('template',locals()) 

por lo que en template.html, acabo de poder:

{% for game in game_list %} 
<p> game.title <p> <br /> <p> game.genre <p> 

Si quiero llenar de datos inicial al utilizar formularios HTML , esto es lo que suele hacer:

{% 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 se puede hacer esto en las formas de Django? Por lo que he visto por la lectura de artículos en línea, lo hacen por razones imperiosas usando forms.__init__:

class Anyforms(forms.Form): 
    super(Anyforms, self).__init__(*args,**kwargs) 

No puedo obtener una bodega de cómo rellenar usando super. ¿Qué datos obtienen los formularios durante el tiempo de ejecución y cómo? ¿Alguna buena conexión que pueda leer para ponerme en marcha y disputar Django Forms?

¿Es esta

<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) 

¿Las variables van a ser reemplazadas en la plantilla?

+0

al realizar esta búsqueda, ¿Qué observó? –

+0

"{{game.title}}" en los campos. :( – diehell

+0

Estoy tan atrapado en esto. – diehell

Respuesta

18

respuesta de S. Lott te dice cómo inicializar el formulario con algunos datos en su punto de vista. Para hacer que su forma en una plantilla, consulte la siguiente sección de la documentación de Django que contienen una serie de ejemplos:

Aunque los ejemplos muestran la prestación de trabajo de un intérprete de Python, que es el Lo mismo cuando se realiza en una plantilla.

Por ejemplo, en lugar de print f, su plantilla simplemente contendría: {{ f }} asumiendo que pasa su formulario a través del contexto como f. Del mismo modo, f.as_p() está escrito en la plantilla como {{ f.as_p }}. Esto se describe en los documentos de plantillas django en la sección Variables.

Update (respondiendo a las observaciones)

No exactamente, la notación plantilla es sólo para plantilla. Su formulario y los datos asociados se inicializan en la vista .

Por lo tanto, la utilización de su ejemplo, su 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}) 

A continuación, la plantilla podría tener algo como:

{{ form }} 

O si desea personalizar el HTML usted mismo:

{{ form.title }} <br /> 
{{ form.genre }} <br /> 

y así sucesivamente.

Recomiendo probarlo y experimentar un poco. Luego haz una pregunta si encuentras un problema.

+0

data = {'id': '{{game.id}}', 'position': '{{game.id}}'} form = UserQueueForm (initial = data) ¿Van a funcionar? – diehell

+0

son los mismos que este data = {'title': '{{game.title}}', 'género': '{{game.genre}}'} formulario (datos) ¿La variable va a ser reemplazada en la plantilla? – diehell

+0

@ user459885: Actualicé la pregunta para responder a sus comentarios. – ars

7

http://docs.djangoproject.com/en/1.2/ref/forms/api/#ref-forms-api-bound-unbound

para enlazar datos a un formulario, pasar los datos como un diccionario como el primer parámetro a su constructor de la clase Form:

>>> data = {'subject': 'hello', 
...   'message': 'Hi there', 
...   'sender': '[email protected]', 
...   'cc_myself': True} 
>>> f = ContactForm(data) 
+3

si los datos no son válidos, al usuario se le mostrarán los errores :(, pero si pasa los datos como 'kwarg inicial 'poblará los campos sin errores' f = ContactForm (initial = data) ' – Jiaaro

3

acaba de cambiar

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

a

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

Creo que esto va a 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 la forma con datos iniciales.

2

Al usar 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 
0

¿Se puede probar con el seguimiento:

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