Django:ModelForm 管理员的当前用户 ID

问题描述 投票:0回答:2

我想用当前用户过滤 ModelChoiceField 。我找到了一个非常接近我想做的解决方案,但我不明白 Django:如何在管理表单中获取当前用户?

接受的答案说

“我现在可以通过访问 self.current_user 来访问 forms.ModelForm 中的当前用户”

--admin.py

class Customer(BaseAdmin):
    form = CustomerForm
    
    def get_form(self, request,obj=None,**kwargs):
        form = super(Customer, self).get_form(request, **kwargs)
        form.current_user = request.user
        return form

--forms.py

class CustomerForm(forms.ModelForm):
    default_tax =   forms.ModelChoiceField(
        queryset=fa_tax_rates.objects.filter(tenant=????)
    )

    class Meta:
        model   = fa_customers

如何获取 modelchoice queryset 上的当前用户(tenant=????) 如何在 modelform(forms.py) 中调用 self.current_user

django django-admin
2个回答
1
投票

重写

__init__
CustomerForm
构造函数:

class CustomerForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        super(CustomerForm, self).__init__(*args, **kwargs)
        self.fields['default_tax'].queryset = 
                        fa_tax_rates.objects.filter(tenant=self.current_user))

表单字段定义中的查询集可以安全地设置为

all()
none()
:

class CustomerForm(forms.ModelForm):
    default_tax = forms.ModelChoiceField(queryset=fa_tax_rates.objects.none()) 

1
投票

只是总结解决方案,因为我很难完成这项工作并理解接受的答案

在admin.py中

class MyModelForm (forms.ModelForm):

    def __init__(self, *args,**kwargs):
    super (MyModelForm ,self).__init__(*args,**kwargs)
    #retrieve current_user from MyModelAdmin
    self.fields['my_model_field'].queryset = Staff.objects.all().filter(person_name = self.current_user)

#数据库中的人名必须与 Django User 中的相同,否则使用类似 person_name__contains 的内容

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelForm 

    def get_form(self, request, *args, **kwargs):
        form = super(MyModelAdmin, self).get_form(request, *args, **kwargs)
        form.current_user = request.user #get current user only accessible in MyModelAdminand pass it to MyModelForm
        return form
© www.soinside.com 2019 - 2024. All rights reserved.