繁体   English   中英

Django 返回带参数的redirect()

[英]Django return redirect() with parameters

在我看来 function 我想调用另一个视图并将数据传递给它:

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

,其中 backend 是 registration.backends object,而 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”参数,但它只是视图 function 的名称,还是 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', (), {})

好的,现在,我可以直接调用我的视图 function 还是需要为其提供 url? 更重要的是,我的函数调用(如果需要,还有 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):

仍然没有反向匹配。 但是在 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):

网址.py:

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

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

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

其次,完全不清楚您期望对cleaned_data 字典发生什么。 不要忘记你不能重定向到 POST - 这是 HTTP 的限制,而不是 Django - 所以你的 clean_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))

评论后编辑

正如您一直在做的那样,使用重定向和反向的全部意义在于您转到 URL - 它返回一个 Http 代码,使浏览器重定向到新的 URL,并调用它。

如果您只是想从代码中调用视图,只需直接执行 - 根本不需要使用 reverse 。

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

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

我在 django3 中喜欢这个

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

我是 Django 的新手。 我的一个项目,我使用渲染而不是重定向来发送数据。 那效果很好。 我的代码是这样的--->

  for key, value in request.POST.lists():
        print(key, value)
        if key.split('-')[-1] != 'csrfmiddlewaretoken':
            qu_id = key.split('-')[-1]
            get_answer = Answer.objects.filter(question_id=qu_id,
                                               correct_answer__option__contains=value[0])
            total_correct_answer = get_answer.count()
    context = {'score': total_correct_answer}
    return render(request, 'result.html', context)
context = {'questions': questions, 'total_correct_answer': total_correct_answer}
return render(request, 'test.html', context)
def someview(request, *args, **kwargs):
    pass
    #your code

# insted of redirect return the view as sach

return someview(request, my_args, my_kwargs=kwargs) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM