[英]Django: How to filter ForeignKey choices by request.user with ModelFormSet
[英]how to override django admin form Foreignkey based on request.user
class PromoAdmin(admin.modelAdmin)
list_display = ( 'name', 'id', 'category', 'promo_type', 'store', 'brand', 'date_start' )
form = SampleForm
class SampleForm(forms.ModelForm):
class Meta:
model = Promo
def __init__(self, request *args, **kwargs):
super(PromoAdminForm, self).__init__(*args, **kwargs)
self.fields["store"].queryset = Store.objects.filter(onwer=request.user)
根据要求收到错误
Django版本:1.3.1异常类型:TypeError异常值:
init ()至少接受2个参数(给定1个)
您不能在字段声明中使用request.user初始化存储字段。 您可以尝试以下方法:
class MyAwesomeForm(forms.ModelForm):
store = forms.ModelChoiceField(Store.objects)
class Meta:
model = Promo
def __init__(self, user, *args, **kwargs):
super(MyAwesomeForm, self).__init__(*args, **kwargs)
self.fields['store'].queryset = Store.objects.filter(owner=user)
在实例化表单时,您可以传递request.user对象。
myform = MyAwesomeForm(request.user)
如果要在管理员中实现此目的,则可以尝试执行此操作 。仅在管理员中提供与登录用户有关的对象,才有可能覆盖ModelAdmin.queryset函数:
class MyModelAdmin(admin.ModelAdmin):
form = MyAwesomeAdminForm()
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
if request.user.is_superuser:
return qs
return qs.filter(store__owner=request.user)
class MyAwesomeAdminForm(forms.ModelForm):
class Meta:
model = Promo
请注意,只有在促销模型中存储了如下外键字段时,store__owner才起作用:
class Promo(models.Model):
store = models.ForeignKey(Store)
class Store(models.Model):
owner = models.ForeignKey(User)
我认为也应该以某种方式将请求传递给表单的init方法。 但是没有找到合适的方法来做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.