Django使用参数返回redirect()


80

在我的视图函数中,我想调用另一个视图并将数据传递给它:

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

,其中backend是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')

看来我需要提供“ some-view-name”参数,但这仅仅是视图函数的名称还是url的名称?因此,我想使其与在django-registration中完成的方式类似,其中:

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调用(如果需要,还有一个网址)应该是什么样子?后端和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):

Answers:


65

首先,您的URL定义根本不接受任何参数。如果要将参数从URL传递到视图中,则需要在urlconf中定义它们。

其次,还不清楚您对cleaned_data字典会发生什么。别忘了您不能重定向到POST-这是HTTP的局限性,而不是Django-因此您的cleaned_data必须是一个URL参数(可怕),或者最好是一系列GET参数-所以URL将采用以下形式:

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

等等。在这种情况下,URLconf定义中包括field1,field2和field3,它们可通过查看在视图中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

并且如果我不会在此视图中对cleaned_data进行操作,而是将其传递以供以后使用?我在cleaned_data字典中有很多字段,所以我想避免将它们作为get字符串传递给它:)
muntu 2010年

我不明白这个评论。请更详细地说明,并在必要时更新您的问题。
Daniel Roseman

第二个视图将仅存储此发送的数据以供进一步使用。但是您确定我需要为此提供url吗?从文档看来,我只是直接调用视图。我也希望只发送带有后端和数据的字典到redirect()中(就像在django-registration中一样),然后再到url中(就像register函数中的dict一样),但是从我看来这是不可能的吗?
muntu 2010年

是的是的就是这样!我浪费了很多时间,完全忘记了会议:/该死,谢谢!
蒙图2010年

1
关于在不需要URL的情况下仅调用该函数的好处。
maxbellec

54

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

正是我想要的。
Parvathirajan Natarajan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.