Хорошо, я узнаю свой код в вашем вопросе, поэтому, я думаю, мне лучше попробовать и ответить на него. Но я бы сказал прежде всего, что этот фрагмент действительно предназначен только для проверки минимального количества форм в наборе форм. Ваш вариант использования отличается - вы хотите что-то проверить в каждой форме. Это должно быть сделано с проверкой на уровне формы, а не формы.
Тем не менее, проблема не в самом коде, который вы разместили, а в том, что это только его часть. Очевидно, что если вы хотите получить пользователя из kwargs при инициализации формы или набора форм, вам нужно убедиться, что пользователь фактически передан в эту инициализацию, которой по умолчанию не является.
К сожалению, администратор Django на самом деле не дает вам надлежащего перехвата для перехвата самой инициализации. Но вы можете обмануть, переопределив функцию get_form
и используя functools.partial
, чтобы обернуть класс формы аргументом запроса (этот код не проверен, но должен работать):
from functools import partial
class OrderForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(OrderForm, self).__init__(*args, **kwargs)
def clean(self)
if self.user.groups.filter(name='Seller').count() == 1:
if self.cleaned_data['discount'] > 20:
raise forms.ValidationError('Not authorized to specify a discount greater than 20%')
return self.cleaned_data
class MyAdmin(admin.ModelAdmin):
form = OrderForm
def get_form(self, request, obj=None, **kwargs):
form_class = super(MyAdmin, self).get_form(request, obj, **kwargs)
return functools.partial(form_class, user=request.user)