我刚刚创建了一个forms.models.BaseInlineFormSet
以覆盖TabularInline模型的默认表单集。在表单集验证(clean
)过程中,我需要评估用户组,因为一些组必须在(0,20)的范围内写入一个数字。
我正在使用django管理工具来自动生成界面。
我尝试从init方法的kwargs中获取请求和用户,但是我无法得到引用。
这是我现在拥有的:
class OrderInlineFormset(forms.models.BaseInlineFormSet):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(OrderInlineFormset, self).__init__(*args, **kwargs)
def clean(self):
# get forms that actually have valid data
count = 0
for form in self.forms:
try:
if form.cleaned_data:
count += 1
if self.user.groups.filter(name='Seller').count() == 1:
if form.cleaned_data['discount'] > 20:
raise forms.ValidationError('Not authorized to specify a discount greater than 20%')
except AttributeError:
# annoyingly, if a subform is invalid Django explicity raises
# an AttributeError for cleaned_data
pass
if count < 1:
raise forms.ValidationError('You need to specify at least one item')
class OrderItemInline(admin.TabularInline):
model = OrderItem
formset = OrderInlineFormset
然后我在我的ModelAdmin中使用inlines = [OrderItemInline,]
。
不幸的是,self.user总是None
,所以我无法比较用户组并且筛选器没有被应用。我需要进行筛选,因为其他组应该能够指定任何折扣百分比。
我该怎么办?如果您还需要ModelAdmin代码,我会发布它的(我只是避免复制整个代码以避免混淆)。