Джанго - Как установить запрос в админке? - PullRequest
0 голосов
/ 11 января 2019

У меня есть форма, которая использует объект запроса:

class FooForm(forms.ModelForm):

    class Meta:
        model = Foo
        fields = ('title', )

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request')
        super().__init__(*args, **kwargs)

На мой взгляд, всякий раз, когда я хочу создать экземпляр формы, это так же просто, как сделать следующее:

class FooCreateView(LoginRequiredMixin, CreateView):
    model = Foo
    form_class = FooForm

    def get_form_kwargs(self):
        kwargs = super(FooCreateView, self).get_form_kwargs()
        kwargs.update({'request': self.request})
        return kwargs

Теперь я хочу использовать ту же форму в админ-панели, поэтому я делаю следующее:

class FooAdmin(admin.ModelAdmin):
    form = FooForm

Но Бум! Умирает:

KeyError at /admin/foo/foo/add/
'request'

Я пытался сделать следующее, но это не сработало

def get_form(self, request, *args,  **kwargs):
    form = super(FooAdmin, self).get_form(request, *args, **kwargs)
    form.request = request
    kwargs['request'] = request
    return form

Итак, есть ли способ передать запрос в форму администратора?

1 Ответ

0 голосов
/ 11 января 2019

Метод get_form() возвращает только класс, а не его экземпляр. Реализация формы скрыта в add_view и change_view методах ModelAdmin. Вы можете как-то обойти это, создав новый класс формы в методе get_form:

def get_form(self, request, obj=None, **kwargs):

    FooForm = super(FooAdmin, self).get_form(request, obj, **kwargs)

    class RequestFooForm(FooForm):
        def __new__(cls, *args, **kwargs):
            kwargs['request'] = request
            return FooForm(*args, **kwargs)

    return RequestFooForm

В противном случае, если вам нужен только доступ во время сохранения, вы, возможно, также можете взглянуть на методы save_form и save_model администратора модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...