Django return redirect () с параметрами



в моей функции просмотра я хочу вызвать другое представление и передать ему данные:



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


, где бэкэнд регистрации.backends объект и форма.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')


похоже, мне нужно предоставить аргумент "some-view-name", но это просто имя функции представления или имя url-адреса ? Так что я бы хотел хотелось бы сделать его похожим на то, как это делается в django-регистрация, где :



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', (), {})


Итак, теперь я могу напрямую вызвать свою функцию просмотра или мне нужно предоставить url-адрес для нее ? И что еще более важно, как должен выглядеть мой вызов funciotn (и url, если это необходимо)? И backend, и 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):
723   2  

2 ответов:

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

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

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

и так далее. В этом случае field1, field2 и field3 являются не включены в определение 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))

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

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

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

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

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

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)
    # ...

Comments

    Ничего не найдено.