Использование венгерской нотации должно быть наказано смертью.
Это должно быть достаточно спорным;)
Ответ Бер - хранить его в 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)
Обычный подход - сохранить объект запроса в локальной ссылке потока с использованием промежуточного программного обеспечения. Затем вы можете получить к нему доступ из любого места вашего приложения, включая метод 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
Вы не всегда можете использовать этот метод (и, вероятно, это плохая практика), но если вы используете форму только в одном представлении, вы можете охватить его внутри самого метода просмотра.
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")