2013-08-08 3 views
0

У меня есть модуль с функцией просмотра с именем «edit» и функцией с именем «handle_upload».Передача переменных функции

Я хотел бы передать две переменные значения, доступные в функции редактирования, функции handle_upload, но я не знаю, как, поскольку я не вызываю функцию handle_upload в функции представления, поэтому я не могут передавать значения в качестве параметров.

Для ясности:

# my_module.py 

def edit(): 
    dynamic variable #1 
    dynamic variable #2 
    render_to_response(some_site.html, locals(), context_instance = RequestContext(request)) 

def handle_upload(): 
    # here is where I would want to get both variables. 

ответ

2

Мне кажется, вы хотите, чтобы переменные были доступны в двух отдельных запросах на сервер django - сначала вы хотите установить их, когда пользователь перейдет на вид edit, затем вы хотите получить их в другом представлении, которое вызывает handle_upload.

Здесь есть два варианта, в зависимости от фактических данных, которые вы хотите передать.

  • Обращаем внимание на шаблон и добавьте его в скрытые поля в форме редактирования.

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

Прежде всего, я хотел бы посоветовать использовать render вместо render_to_response, поскольку последний устарел и скоро будет устаревшим. render гарантирует, что вы есть RequestContext объект, и требует, чтобы первый аргумент является фактическим request объекта:

render(request, 'some_site.html', locals()) 

Затем в шаблоне, в виде:

<input type='hidden' name='name1' value='{{ dynamic_variable_1 }}' /> 
<input type='hidden' name='name2' value='{{ dynamic_variable_2 }}' /> 

Затем использовать request.POST.get('name1'), чтобы получить значение от dynamic_variable_1 и т. д.

  • Использовать сеанс промежуточного программного обеспечения.

Таким образом, данные будут оставаться на сервере и даже останутся объектом Python, поэтому он обрабатывает все виды объектов (я думаю, на 100% не уверен).

Во-первых, убедитесь, что 'django.contrib.sessions.middleware.SessionMiddleware' находится в вашем MIDDLEWARE_CLASSES в ваших settings.py. По умолчанию используется команда Django startapp.

Затем выполните следующие действия в edit:

request.session['name1'] = dynamic_variable1 
request.session['name2'] = dynamic_variable2 

Тогда в представлении, что вызывает handle_upload, просто выполните следующие действия и передать переменные handle_upload:

dynamic_variable1 = request.session['name1'] 
dynamic_variable2 = request.session['name2'] 
+0

+1 по использованию сеансов – Basti

+0

Спасибо. Сеансы работали как шарм. – TheAptKid

0

У вас есть два варианта.

  • объявлять две переменные глобальные, используя ключевое слово global
  • имеют handle_upload два аргумента, и передать две переменные в

Если вы не называть его из edit(), это означает, что вы бы необходимо вернуть две переменные из edit() на сайт вызова, а затем передать их в handle_upload() оттуда.

0

Вы могли бы пойти на что-то вроде:

dynamic variable #1 
dynamic variable #2 

def edit(): 
     global dynamic variable #1, dynamic variable #2 
     render_to_response(…) 

def handle_upload(): 
     global dynamic variable #1, dynamic variable #2 
     #… 

Но будьте осторожны с глобальными переменными, если вы многопоточности. Если вы это сделаете, рассмотрите блокировку ;-)

Смежные вопросы