web-dev-qa-db-fra.com

django - que contient le paramètre d'action de formulaire lorsque la vue nécessite un paramètre?

Voici ce que j'ai:

myview.py avec une vue qui prend un paramètre user:

def myview(request, user):
   form = MyForm(request.POST)
   ....
   return render_to_response('template.html',locals(), context_instance=RequestContext(request))

user passe par une URL.

urls.py:

...

urlpatterns += patterns('myview.views',
    (r'^(?P<user>\w+)/', 'myview'),
)

...

J'ai aussi un template.html avec un formulaire:

<form name="form" method="post" action=".">
...
</form>

Que se passe-t-il dans le paramètre d'action de formulaire si la fonction myview nécessite un paramètre?

En ce moment, j'ai action=".". La raison pour laquelle je demande, c'est parce que lorsque je remplis le formulaire dans (templates.html) et que je clique sur le bouton Envoyer, je ne vois absolument aucune valeur de champ transmise à partir de ce formulaire. C'est presque comme si je passais un formulaire vide lorsque je clique sur le bouton soumettre. Des idées? Je vous remercie!

29
avatar

Vous publiez dans la même vue qui sert également le formulaire. Donc au début, la vue est appelée et sert le formulaire. Lorsque vous publiez le formulaire, la même vue est appelée mais cette fois, vous traitez le formulaire. C'est pourquoi l'action est vide.

23
Timmy O'Mahony

Si vous souhaitez définir explicitement l'action, en supposant que vous avez une variable nom d'utilisateur dans votre modèle,

<form name="form" method="post" action="{% url myview.views username %}">

ou vous pouvez attribuer un nom à l'URL dans votre urls.py afin que vous puissiez la référencer comme ceci:

# urls.py
urlpatterns += patterns('myview.views',
    url(r'^(?P<user>\w+)/', 'myview', name='myurl'), # I can't think of a better name
)

# template.html
<form name="form" method="post" action="{% url myurl username %}">
33
gladysbixly

Cela ne devrait rien exiger. En supposant que vous êtes à l'URL suivante:

www.yoursite.com/users/johnsmith/

Votre formulaire doit être:

<form name="form" method="post" action="">

À ce stade, vous êtes déjà dans myview avec l'utilisateur johnsmith. Votre vue devrait ressembler à ceci:

if request.method == 'POST':
    form = MyForm(request.POST)
    if form.is_valid():
        # you should be able to extract inputs from the form here
else:
    form = MyForm()
6
Thierry Lam

Vous pouvez utiliser request.path et cela fonctionnera dans la plupart des cas.

3
Gattster