【发布时间】:2012-01-20 06:56:25
【问题描述】:
我刚刚创建了一个forms.models.BaseInlineFormSet 来覆盖 TabularInline 模型的默认表单集。我需要在表单集验证 (clean) 中评估用户组,因为某些组必须在范围 (0,20) 内写入数字。
我正在使用 django admin 来自动生成界面。
我尝试在 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 代码,我会发布它(我只是避免复制整个代码以避免混淆)。
【问题讨论】:
标签: django django-models django-admin django-forms