Django使用参数返回redirect()

mun*_*ntu 70 python django redirect parameter-passing

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

return redirect('some-view-name', backend, form.cleaned_data)
Run Code Online (Sandbox Code Playgroud)

,其中后端是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')
Run Code Online (Sandbox Code Playgroud)

看起来我需要提供'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', (), {})
Run Code Online (Sandbox Code Playgroud)

好的,我现在可以直接调用我的视图功能,还是需要提供一个网址?更重要的是,我的funciotn调用(以及需要时的URL)应该是什么样的?后端和cleaning_data都只是通过此视图传递以供以后使用.我试过这个,但不合适:

url(r'^link/$', some-view-name)   
def some-view-name(request, *args):
Run Code Online (Sandbox Code Playgroud)

除此之外:

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

还是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):
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 58

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

其次,您还不清楚您对cleaning_data字典的期望是什么.不要忘记你不能重定向到POST - 这是HTTP的限制,而不是Django - 所以你的cleaning_data要么是一个URL参数(太可怕了),要么更好一些GET参数 - 所以URL将采取以下形式:

/link/mybackend/?field1=value1&field2=value2&field3=value3
Run Code Online (Sandbox Code Playgroud)

等等.在这种情况下,field1,field2和field3 包含在URLconf定义中 - 它们在视图中可用request.GET.

所以你的urlconf将是:

url(r'^link/(?P<backend>\w+?)/$', my_function)
Run Code Online (Sandbox Code Playgroud)

并且视图看起来像:

def my_function(request, backend):
   data = request.GET
Run Code Online (Sandbox Code Playgroud)

反之亦然(导入后urllib):

return "%s?%s" % (redirect('my_function', args=(backend,)),
                  urllib.urlencode(form.cleaned_data))
Run Code Online (Sandbox Code Playgroud)

评论后编辑

正如您所做的那样,使用重定向和反向的重点在于您转到URL - 它返回一个Http代码,该代码会导致浏览器重定向到新的URL,然后调用它.

如果您只想从代码中调用视图,只需直接执行即可 - 根本不需要反向使用.

也就是说,如果您只想存储数据,那么只需将其放入会话中:

request.session['temp_data'] = form.cleaned_data
Run Code Online (Sandbox Code Playgroud)

  • 如果我不会在此视图中对 clean_data 进行操作,而只是将其传递以供以后使用?我在 clean_data 字典中有很多字段,所以我想避免将它们作为获取字符串传递:) (2认同)
  • 我不明白这个评论。请更详细地解释,如有必要,请更新您的问题。 (2认同)
  • 如果不需要 URL,则只需调用该函数就可以了。 (2认同)

roa*_*ach 45

urls.py:

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

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)
    # ...
Run Code Online (Sandbox Code Playgroud)


yan*_*zhi 13

我确实喜欢 django3 中的这个

redirect_url = reverse('my_function', args=(backend,))
parameters = urlencode(form.cleaned_data)
return redirect(f'{redirect_url}?{parameters}')
Run Code Online (Sandbox Code Playgroud)