2009-05-06 7 views
-1

J'ai écrit constructeur personnalisé pour une forme, toute la classe de forme ressemble à ceci:Django: constructeur personnalisé pour la classe de forme, des problèmes avec l'accès aux données de request.POST

class UploadForm(forms.Form): 
    file = forms.FileField(label = "Plik") 

    def __init__(self, coto, naglowek, *args, **kwargs): 
     super(UploadForm, self).__init__(*args, **kwargs) 
     self.coto = coto 
     self.naglowek = naglowek 

Lors de la présentation sous forme, à mon avis , j'ai quelque chose comme

if request.method == 'POST': 
    form = UploadForm(request.POST, request.FILES) 
    if form.is_valid(): 
     add_form(request.FILES['file']) 
     return HttpResponseRedirect('uploaded/') 

Le problème est que lorsque je crée la forme de cette façon, à mon avis, je ne suis pas repassais Coto et naglowek, alors quand je fais appel form.is_valid() -> retourne false.

Le modèle qui passess il ressemble:

<table class="uploadform"> 
<form action="." method="POST" enctype="multipart/form-data"> 
{% for form in forms %} 
<tr> 
    <td>{{ form.naglowek }}</td> 
    <td>{{ form.file }}</td> 
    <td><input type="submit" name="{{ form.coto }}" id="{{ form.coto }}" value="Wyślij"></td> 
</tr> 
{% endfor %} 
</form> 
</table> 

Je vous serais reconnaissant pour toute suggestion.

[EDIT] je ne pourrais pas le dire assez clearlly, mais je vais essayer de mon mieux:

Quand je présente ce formulaire, en vue, je dois savoir qui soumettre bouton a été pressé - I avoir beaucoup d'entre eux affectés à une forme unique. D'après ce que je sais, quand j'attribue un identifiant à un bouton de soumission, il devrait être disponible en courrier, n'est-ce pas? L'astuce est que ce n'est pas disponible.

J'ai deux questions: * Ce qui doit être fait, si je veux savoir quel bouton de soumission a été pressé? Est-ce que l'attribution du nom est le seul moyen? * Y a-t-il une erreur dans ma logique?

+0

Veuillez mettre vos vrais messages d'erreur et de retraçage dans la question. –

Répondre

0
request.POST['coto'] 
request.POST['naglowek'] 

Je suppose.

+0

J'ai essayé - et ça ne marche pas. Je pourrais avoir foiré celui-ci quelque part, mais je ne sais pas où. Merci d'avoir essayé d'aider. – praavDa

+0

peut-être que vous pourriez vérifier votre code HTML pour voir ce qui est réellement soumis? – SilentGhost

+0

et que signifie exactement "ça ne marche pas"?Par – SilentGhost

0

Vous avez redéfini le constructeur de formulaire par défaut et modifié son ordre de paramètres. Donc, vous devez instancier votre formulaire personnalisé avec désignation explicite des arguments:

form = UploadForm(data=request.POST, files=request.FILES, coto=..., naglowek=...) 
+0

Alex, je sais que je redéfinie paramètres commander - le truc ici est que je ne peux pas accéder à 'coto' et 'naglowek' dans le dictionnaire POST. – praavDa

2

Votre question est un gâchis. Il y a du code et il y a un edit avec une autre question. La question d'édition n'a rien à voir avec le titre.

Veuillez mettre à jour cette question pour être votre réelle question.

Si vous avez plusieurs boutons d'envoi, vous devez leur donner des noms ou des valeurs distincts (ou les deux). Voici notre code qui utilise des valeurs distinctes pour distinguer quel bouton a été cliqué.

 <form method="post" action="." enctype="multipart/form-data"> 
      <input type="hidden" name="object_id" value="{{e.id}}"/> 
      {% ifequal object.workflow "uploaded" %} 
      <input type="submit" name="action" value="Validate"/> 
      <br/> 
      <input type="submit" name="action" value="Delete"/> 
      {% endifequal %} 
      {% ifequal object.workflow "validated" %} 
      <input type="submit" name="action" value="Load"/> 
      {% endifequal %} 
      {% ifequal object.workflow "processed" %} 
      <input type="submit" name="action" value="Undo"/> 
      {% endifequal %} 
      {% ifequal object.workflow "failed" %} 
      <input type="submit" name="action" value="Validate"/> 
      {% endifequal %} 
     </form> 

La fonction d'affichage a ce genre de chose:

  if request.POST['action'] == "Delete": 

pour modifier l'action basée sur le bouton.

Questions connexes