Django 返回带有参数的 redirect()

2025-03-10 08:52:00
admin
原创
77
摘要:问题描述:在我的视图函数中我想调用另一个视图并将数据传递给它:return redirect('some-view-name', backend, form.cleaned_data) ,其中 backend 是 registration.backends 对象,form.cleaned_data 是表单数据...

问题描述:

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

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?更重要的是,我的函数调用(以及一个 URL,如果需要)应该是什么样子?后端和 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-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):

解决方案 1:

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

解决方案 2:

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

其次,你完全不清楚你期望 cleaned_data 字典会发生什么。别忘了你不能重定向到 POST - 这是 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))

评论后编辑

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

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

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

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

解决方案 3:

我确实喜欢 django3 中的这个

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

解决方案 4:

我是 Django 新手。在我的一个项目中,我使用 render 而不是 redirect 来发送数据。效果很好。我的代码如下 --->

  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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4027  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2755  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   86  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   99  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   87  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用