2010-07-09 3 views
54

В моей функции зрения я хочу, чтобы вызвать другую точку зрения и передавать данные на него:Джанго обратный редирект() с параметрами

return redirect('some-view-name', backend, form.cleaned_data) 

, где Бэкэнд из registration.backends объекта, и form.cleaned_data является ДИКТ данных формы (но оба они должны быть отправлены как * args или ** kwargs, чтобы предотвратить повышение ошибки Don't mix *args and **kwargs in call to reverse()!). Из того, что я нашел в документации:

def my_view(request): 
    ... 
    return redirect('some-view-name', foo='bar') 

Похоже, мне нужно, чтобы обеспечить «некоторый-View-имя» аргумент, но это просто имя функции вида, или имя URL ? Так что я хотел бы сделать это подобно тому, как это сделано в Джанго регистрации, где:

to, args, kwargs = backend.post_registration_redirect(request, new_user) 
return redirect(to, *args, **kwargs) 

def post_registration_redirect(self, request, user): 
    return ('registration_complete',(), {}) 

Ok так что теперь, я могу позвонить напрямую мою функцию просмотра или мне нужно сделать, чтобы обеспечить URL для него? И что еще важнее, как должен выглядеть мой funciotn (и URL-адрес, если необходимо)? Как бэкэнд, так и cleaned_data просто передаются через это представление для последующего использования. Я попытался это, но это неприлично:

url(r'^link/$', some-view-name) 
def some-view-name(request, *args): 

Как это:

return redirect('some_url', backend=backend, dataform.cleaned_data) 
url(r'^link/$', some-view-name)  
def some-view-name(request, backend, data): 

еще NoReverseMatch. Но в django-регистрации я видел что-то вроде этого:

url(r'^register/$',register,{'backend': 'registration.backends.default.DefaultBackend'}, name='registration_register'), 

def register(request, backend, success_url=None, form_class=None, 
      disallowed_url='registration_disallowed', 
      template_name='user/login_logout_register/registration_form.html', 
      extra_context=None): 

ответ

52

Во-первых, ваше определение URL-адреса вообще не принимает никаких параметров. Если вы хотите, чтобы параметры были переданы из URL-адреса в представление, вам необходимо определить их в urlconf.

Во-вторых, совсем не ясно, что вы ожидаете от словаря cleaned_data. Не забывайте, что вы не можете перенаправлять на POST - это ограничение HTTP, а не Django, поэтому ваш cleaned_data должен быть URL-параметром (ужасным) или, что несколько лучше, рядом параметров GET, поэтому URL-адрес будет находиться в форме:

/link/mybackend/?field1=value1&field2=value2&field3=value3 

и так далее. В этом случае поле1, поле2 и поле3 составляют , а не, включенные в определение URLconf - они доступны в представлении через request.GET.

Так что ваш URLconf будет:

url(r'^link/(?P<backend>\w+?)/$', my_function) 

и вид будет выглядеть так:

def my_function(request, backend): 
    data = request.GET 

и обратное будет (после импорта urllib):

return "%s?%s" % (redirect('my_function', args=(backend,)), 
        urllib.urlencode(form.cleaned_data)) 

Отредактировано после комментария

Весь смысл использования переадресации и обратного преобразования, как вы делали, заключается в том, что вы переходите к URL-адресу - он возвращает Http-код, который заставляет браузер перенаправлять новый URL-адрес и называть его.

Если вы просто хотите вызвать представление из своего кода, просто сделайте это напрямую - нет необходимости использовать обратное вообще.

Тем не менее, если все, что вам нужно сделать, это сохранить данные, а затем просто положить его в сессии:

request.session['temp_data'] = form.cleaned_data 
+0

и если я не буду работать с cleaned_data в этом представлении, а просто передам его для последующего использования? У меня есть много полей в файле cleaned_data, поэтому я бы хотел избежать передачи их как строки get :) – muntu

+0

Я не понимаю этот комментарий. Пожалуйста, объясните подробнее, обновив свой вопрос, если это необходимо. –

+0

этот второй вид будет хранить только эти отправленные данные для дальнейшего использования. Но вы уверены, что мне нужно предоставить URL-адрес? Из документов это похоже, что я просто вызываю представление напрямую. Также я надеялся просто отправить словарь с бэкэнд и данными в redirect() (как это делается в django-registration), а затем в url (например, этот dict в функции register), но из того, что я вижу, это невозможно? – muntu

29

urls.py:

#...  
url(r'element/update/(?P<pk>\d+)/$', 'element.views.element_update', name='element_update'), 

views.py:

from django.shortcuts import redirect 
from .models import Element 


def element_info(request): 
    # ... 
    element = Element.object.get(pk=1) 
    return redirect('element_update', pk=element.id) 

def element_update(request, pk) 
    # ... 
Смежные вопросы