web-dev-qa-db-fra.com

Remplissage initial sur les formulaires Django

J'ai décidé d'apprendre les formulaires Django. Depuis quelque temps, j'utilise des formulaires HTML car il m'est difficile de composer avec Django Forms.

Comment pourrais-je renseigner les données initiales dans Django Forms? Exemple:

Considérez si ces modèles sont remplis. Contient des données.

models.py

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

alors si j'ai 

view.py

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

donc dans template.html , je pourrais simplement:

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

Si je veux renseigner les données initiales lors de l’utilisation de HTML forms , c’est ce que je fais habituellement:

    {% 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" />

Comment puis-je faire cela dans Django Forms? D'après ce que j'ai vu en lisant des articles en ligne, ils le font en remplaçant par forms.__init__:

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

Je n'arrive pas à comprendre comment peupler avec super. Quelles données obtiennent les formulaires pendant l'exécution et comment? Y a-t-il des liens intéressants que je pourrais lire pour que je sois opérationnel sur Django Forms?

Est-ce

<input="text" name="title" value="{{game.title}}" /> 
<input="text" name="genre" value="{{game.genre}}" /> 

équivalent à cela?

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

Les variables vont-elles être remplacées dans le modèle?

20
diehell

La réponse de S. Lott vous explique comment initialiser le formulaire avec certaines données de votre vue. Pour rendre votre formulaire dans un modèle, consultez la section suivante de la documentation Django qui contient un certain nombre d'exemples:

Bien que les exemples montrent que le rendu fonctionne à partir d'un interpréteur Python, c'est la même chose lorsqu'elle est effectuée dans un modèle. 

Par exemple, au lieu de print f, votre modèle contiendrait simplement: {{ f }} en supposant que vous passez votre formulaire dans le contexte sous la forme f. De même, f.as_p() est écrit dans le modèle sous la forme {{ f.as_p }}. Ceci est décrit dans la documentation du modèle Django dans la section Variables .

Mise à jour (en réponse aux commentaires)

Pas exactement, la notation de modèle est seulement pour template . Votre formulaire et les données associées sont initialisés dans la vue view

Donc, en utilisant votre exemple, votre vue contiendrait quelque chose comme:

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

Ensuite, votre modèle aurait quelque chose comme:

{{ form }}

Ou si vous vouliez personnaliser le code HTML vous-même:

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

etc. 

Je recommande d'essayer et d'expérimenter un peu. Puis posez une question si vous rencontrez un problème.

20
ars

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

Pour lier des données à un formulaire, transmettez-les sous forme de dictionnaire en tant que premier paramètre au constructeur de votre classe Form:

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

il suffit de changer

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

à

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

Lorsque vous utilisez des CBV, vous pouvez remplacer get_initial() pour renseigner les données initiales dans le formulaire. Exemple:

def get_initial(self):
    initial = super(MyView, self).get_initial()
    initial['start_date'] = datetime.date.today()
    return initial
2
SaeX

Pouvez-vous essayer ce qui suit:

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

fonctionne bien pour moi sur Django 1.8

1
Fred Sousa

Je pense que cela fonctionnera aussi, mais pas sûr.

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

Et dans la vue, vous pouvez faire comme formulaire.field pour afficher le formulaire avec les données initiales.

0
Waqas

Vous pouvez passer l'instance directement si vous définissez l'attribut de modèle sur la classe de formulaire.

class GameForm(forms.Form):
    class Meta:
        model = Game

A votre avis:

def view(request):
    game = Game.objects.get(id=1)
    form = GameForm(instance=game)
    return render(request, 'template.html', {'form': form})

Fonctionne pour moi sur Django 2.1