widgets form fields example django django-forms

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)