2011-11-02 3 views
0

Je ne sais pas si je le fais de la bonne manière.Django Forms: Comment itérer sur un choix d'un champ dans le formulaire Django

J'ai une forme:

class ConnectSelectMultipleForm(forms.Form): 
    class Meta: 
     model = Connect 

    def __init__(self, *args, **kwargs): 
     messages = kwargs.pop('messages') 
     choices = [] 
     if messages: 
      pass 
     else: 
      messages = [] 

     for message in messages: 
      index = (message.id, {message.sender, message, message.id}) 
      choices.append(index) 

     super(ConnectSelectMultipleForm, self).__init__(*args, **kwargs) 
     self.fields['message'] = forms.MultipleChoiceField(choices=choices, 
            widget=forms.CheckboxSelectMultiple) 

Comme on le voit ci-dessus, je vous envoie {message.sender, message ,message.id} au modèle. Maintenant, je veux accéder à ces variables dans le modèle.

{% for field in select_form %}  
    {% for fi in field %} 
     {{ fi.message }} 
     {{ fi.message.sender }} 
     {{ fi.message.id }} 
    {% endfor %} 
{% endfor %} 

Le code ci-dessus est faux. Mais pouvons-nous faire quelque chose de similaire à cela? Ou existe-t-il une méthode alternative pour faire ce que j'essaie de faire?

Merci d'avance.

### Modifier

Le ouput je reçois par l'impression que le champ est la suivante

set([5, u'Everycrave', <Connect: The deal you refered has been bought>]) 

Ce que je veux est

Id: 5, Nom: Everycrave, Contenu: L'accord vous Référé a été acheté

Je veux que ces champs individuellement

+0

Vous n'avez pas expliqué ce que vous voulez vraiment réaliser. Quelle est la sortie censée être, et pourquoi ne pouvez-vous pas simplement sortir le champ lui-même? –

+0

La sortie que je reçois actuellement est définie ([5, u'Everycrave ', ]). La sortie que je voudrais est 5, Everycrave, L'affaire que vous avez référé a été acheté – Akamad007

+0

Mais je ne comprends pas ce que cela a à voir avec le domaine. Un champ est pour entrer/choisir des données. Qu'essayez-vous d'entrer ou de choisir ici? –

Répondre

4

vous ne voulez pas « itérer sur le terrain " du tout. Django fait cela pour vous. Le seul problème que vous avez est comment créer la valeur d'affichage pour les choix du champ - pour une raison quelconque, vous les créez en tant que jeux, quand vous voulez juste une chaîne. Votre méthode __init__ doit être quelque chose comme ceci:

def __init__(self, *args, **kwargs): 
    messages = kwargs.pop('messages', None) 
    super(ConnectSelectMultipleForm, self).__init__(*args, **kwargs) 
    if messages is None: 
     messages = [] 

    choices = [(message.id, "%s: %s (%s)" % message.sender, message.text, message.id) 
       for message in messages] 

    self.fields['message'].choices = choices 

Maintenant, vous font simplement référence au champ dans le modèle de la manière habituelle: {{ form.message }}.

Questions connexes