Question

Le code ci-dessous supprime certaines valeurs d'un menu déroulant. Il fonctionne très bien, mais je veux supprimer la valeur si l'utilisateur ne dispose pas certaines autorisations. Comment puis-je accéder à request.user dans le constructeur de la ModelForm? Ou est-il une meilleure façon d'accomplir ce que je suis en train de faire?

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)   
Était-ce utile?

La solution 2

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)

Autres conseils

  

Comment puis-je accéder à request.user dans le constructeur du ModelForm?

Pour l'utiliser dans le constructeur de formulaire, juste 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top