Как я получаю доступ к объекту запроса или какой-либо другой переменной в чистой форме () метод?

Использование венгерской нотации должно быть наказано смертью.

Это должно быть достаточно спорным;)

92
задан juliomalegria 12 May 2012 в 01:12
поделиться

3 ответа

Ответ Бер - хранить его в threadlocals - очень плохая идея. Нет абсолютно никаких причин делать это таким образом.

Гораздо лучший способ - переопределить метод формы __ init __ , чтобы он принимал дополнительный аргумент ключевого слова, request . Это сохраняет запрос в форме , где он требуется, и откуда вы можете получить к нему доступ в своем чистом методе.

class MyForm(forms.Form):

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


    def clean(self):
        ... access the request object via self.request ...

и в вашем представлении:

myform = MyForm(request.POST, request=request)
147
ответ дан 24 November 2019 в 06:25
поделиться

Обычный подход - сохранить объект запроса в локальной ссылке потока с использованием промежуточного программного обеспечения. Затем вы можете получить к нему доступ из любого места вашего приложения, включая метод Form.clean ().

Изменение сигнатуры метода Form.clean () означает, что у вас есть собственная модифицированная версия Django, которая может отличаться от вы хотите.

Количество благодарностей промежуточного программного обеспечения выглядит примерно так:

import threading
_thread_locals = threading.local()

def get_current_request():
    return getattr(_thread_locals, 'request', None)

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

Зарегистрируйте это промежуточное ПО, как описано в документах Django

17
ответ дан 24 November 2019 в 06:25
поделиться

Вы не всегда можете использовать этот метод (и, вероятно, это плохая практика), но если вы используете форму только в одном представлении, вы можете охватить его внутри самого метода просмотра.

def my_view(request):

    class ResetForm(forms.Form):
        password = forms.CharField(required=True, widget=forms.PasswordInput())

        def clean_password(self):
            data = self.cleaned_data['password']
            if not request.user.check_password(data):
                raise forms.ValidationError("The password entered does not match your account password.")
            return data

    if request.method == 'POST':
        form = ResetForm(request.POST, request.FILES)
        if form.is_valid():

            return HttpResponseRedirect("/")
    else:
        form = ResetForm()

    return render_to_response(request, "reset.html")
5
ответ дан 24 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: