2009-10-15 13 views
1

Le code ci-dessous supprime certaines valeurs d'un menu déroulant. Cela fonctionne très bien mais je veux supprimer la valeur si l'utilisateur manque de certaines autorisations. Comment puis-je accéder à request.user dans le constructeur du ModelForm? Ou y a-t-il une meilleure façon d'accomplir ce que j'essaie de faire?Django Admin: Obtenir une requête dans le constructeur de ModelForm

class AnnouncementModelForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(AnnouncementModelForm, self).__init__(*args, **kwargs) 
     self.fields["category"].queryset = AnnouncementCategory.objects.filter(can_post=True) 

Répondre

1

Ok voici comment je l'ai résolu:

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "category" and not request.user.has_perm('can_post_to_all'): 
     kwargs["queryset"] = AnnouncementCategory.objects.filter(can_post=True) 
     return db_field.formfield(**kwargs) 
    return super(AnnouncementAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
1

How can I access request.user in the ModelForm's constructor?

Pour l'utiliser dans le constructeur de formulaire, il suffit de passer la demande à elle.

class AnnouncementModelForm(forms.ModelForm): 

    def __init__(self, request, *args, **kwargs): 
     super(AnnouncementModelForm, self).__init__(*args, **kwargs) 
     qs = request.user.foreignkeytable__set.all() 
     self.fields["category"].queryset = qs 
+1

Merci pour votre réponse. Êtes-vous sûr de cela? Parce que je reçois cette TypeError: __init __() prend au moins 2 arguments non-mot-clé (1 donné) – orwellian

+0

Passez l'argument "request" dans la classe de création! Sinon, comment l'obtenir? AnnouncementModelForm (demande) –