2009-07-28 7 views
0

J'ai une forme comme ceci:utilisateur dans le formulaire Classe

class MyForm(forms.Form): 
[...] 

qui est rendu à mon avis:

if request.method == 'GET': 
    form = MyForm(request.GET) 

Maintenant, je veux ajouter un champ de formulaire qui contient un ensemble de valeurs dans un champ de sélection, et le jeu de requête doit être filtré par l'utilisateur actuellement connecté. Alors j'ai changé la signature de la méthode pour qu'il contienne la demande objet:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.myfield = forms.ChoiceField([('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)]) 

mais tout ce que je reçois après avoir rendu la forme est une référence d'objet sous forme de chaîne au lieu du select-widget. Il me semble qu'un champ de formulaire, une fois déclaré, ne peut pas être modifié.

Des idées?

Répondre

2

Remplacez votre dernière ligne de code avec ceci:

self.fields['myfield'].choices = [('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)] 
0

Je pense que voici ce que vous êtes après:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['myfield'] = forms.ModelChoiceField(MyModel.objects.filter(owners=user)) 

C'est en supposant que la méthode __unicode__ de vos retours MyModelself.name. Si ce n'est pas le cas, alors vous pouvez sous-classer ModelChoiceField et remplacer la méthode label_from_instance.

Questions connexes