在我的视图功能中,我想调用另一个视图并将数据传递给它:
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')
看起来我需要提供'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', (), {})
好的,我现在可以直接调用我的查看功能,还是需要为它提供网址?更重要的是,我的funciotn调用(以及需要时的URL)应该是什么样的?后端和cleaning_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-registration中,我看到过这样的事情:
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):
答案 0 :(得分:56)
首先,您的网址定义根本不接受任何参数。如果您希望将参数从URL传递到视图中,则需要在urlconf中定义它们。
其次,您对clean_data字典的期望并不清楚。不要忘了,你不能重定向到一个POST - 这是HTTP的限制,而不是Django的 - 所以你要么cleaned_data需要一个URL参数(可怕的),或者稍微好一点,一系列的GET参数 - 这样的URL将采取以下形式:
/link/mybackend/?field1=value1&field2=value2&field3=value3
等等。在这种情况下,fieldconf,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代码,并调用
如果您只是想在代码中调用视图,只需直接执行即可 - 根本不需要使用反向。
那就是说,如果您只想存储数据,那么只需将其放入会话中:
request.session['temp_data'] = form.cleaned_data
答案 1 :(得分:41)
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)
# ...