开发者

Django Admin: Getting request in ModelForm's constructor

开发者 https://www.devze.com 2022-12-08 02:01 出处:网络
The below code removes certain values from a drop down menu. It works fine but I want to remove the value if the user lacks certain permissions.

The below code removes certain values from a drop down menu. It works fine but I want to remove the value if the user lacks certain permissions. How can I access request.user in the ModelForm's co开发者_JAVA技巧nstructor? Or is there a better way to accomplish what I am trying to do?

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)   


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

To use it in the Form constructor, just pass the request to it.

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


Ok here is how I solved it:

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)
0

精彩评论

暂无评论...
验证码 换一张
取 消