Добавление дополнительных аргументов в конструктор ModelForm с помощью change_view в django admin - PullRequest
0 голосов
/ 17 декабря 2010

Я бы хотел иметь возможность доступа к объекту запроса в методе администраторов django clean(). Как настроить , чтобы пользователь из класса проверки администраторов работал с моделью формы администраторов django

Какую модификацию мне нужно сделать, чтобы change_view ниже

def change_view(self, request, object_id, extra_context=None):
    self.form = GroupForm
    result = super(GroupsAdmin, self).change_view(request, object_id, extra_context)

    return result

, чтобы он вызывал конструктор, который имеет аргумент request

class GroupForm(forms.ModelForm):
    class Meta:
        model = Group

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

1 Ответ

1 голос
/ 06 июля 2011

Поскольку ответ на этот вопрос не был предоставлен, я решил, что должен осветить, как я решил эту проблему на тот случай, если кто-то другой может найти эту информацию полезной.

В конце концов я решил эту проблему, определив пользовательское промежуточное ПО и использовав ThreadLocals.

Сначала определите класс ThreadLocals в вашем forms.py, как показано ниже

import threading
_thread_locals = threading.local()

class ThreadLocals(object):
    """
    Middleware that gets various objects from the
    request object and saves them in thread local storage.
    """
    def process_request(self, request):
        _thread_locals.request = request

Тогда в вашем settings.py обязательно включите промежуточное ПО

MIDDLEWARE_CLASSES = (
    'myproject.myapp.forms.ThreadLocals',
)

И, наконец, получить доступ к объекту запроса так же просто, как и

class GroupForm(forms.ModelForm):
    class Meta:
        model = Group

        def clean(self):
            cleaned_data = super(GroupForm, self).clean()
            self.request = _thread_locals.request
...