Python 从重定向向基于类的视图传递参数
我有一个基于类的视图(Python 从重定向向基于类的视图传递参数,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我有一个基于类的视图(RegistrationView),我希望在重定向时将参数值传递给它,如下所示 # views.py def hook(request): return HttpResponseRedirect(reverse('registration_register', kwargs={'initial': {'email': 'user@example.com'}})) 其中,我的随附URL模式定义为
RegistrationView
),我希望在重定向时将参数值传递给它,如下所示
# views.py
def hook(request):
return HttpResponseRedirect(reverse('registration_register',
kwargs={'initial': {'email': 'user@example.com'}}))
其中,我的随附URL模式定义为:
# urls.py
urlpatterns = [
url(r'^account/register/$',
RegistrationView.as_view(form_class=RegistrationForm),
name='registration_register'),
]
并且initial是注册视图
中的有效参数值
但是,当我运行这个程序时,我遇到了以下错误,因为我没有在url中定义参数(如果可能的话,我不想在url路径中定义参数)
与参数“()”和关键字参数“{'initial':{'email':”相反user@example.com找不到“}}”。已尝试1个模式:[“帐户/注册表/$”]
我遇到了下面讨论将关键字参数传递给基于类的视图的内容,但是,我无法让它与上面的代码一起工作
从概念上讲,我试图实现的功能与下面的功能相当,只是使用了HttpRedirect
,而不是生成直接的响应
def hook(request):
return RegistrationView.as_view(
form_class=RegistrationForm, initial={'email': 'user@example.com'})(request)
有人能告诉我如何用这个初始参数值重定向到我的视图吗?好吧,就像你说的,你还没有在URL中定义这个参数,所以我不知道你认为反向函数会对它做什么。尽管您说它是RegistrationView的“有效参数”,但很明显,该视图也不希望使用该参数 如果要通过
reverse
传递此数据,则需要编写一个不需要参数的视图,并为其提供一个接受这些参数的URL
另一种方法是使用会话传递此数据。正如您所说,您尚未在URL中定义该参数,因此我不知道您认为反向函数将如何处理它。尽管您说它是RegistrationView的“有效参数”,但很明显,该视图也不希望使用该参数 如果要通过
reverse
传递此数据,则需要编写一个不需要参数的视图,并为其提供一个接受这些参数的URL
另一种方法可能是使用会话传递此数据。您混淆了一些事情 使用
args
和kwargs
传递到reverse
的参数用于构建URL。为了让视图接受这些参数,相应的URL模式必须有一个占位符
看看这个例子:
# urls.py
...
url(r'^/polls/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
...
# views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
>>> reverse('detail', kwargs={'question_id': 123})
'/polls/123/'
您可以使用request.GET
访问视图中的查询参数,在本例中为request.GET.GET('foo')
现在,关于基于类的视图。简单地说,as_view()
是一个错误的位置,用于传递参数,每个请求的参数应该不同。在引擎盖下,表达式RegistrationView.as\u view(form\u class=RegistrationForm)
创建一个工厂函数,该函数为每个请求实例化一个新的RegistrationView实例as\u view()
“存储”它的参数并将它们传递给RegistrationView。\uu初始化\uuu()
TL;医生:
将电子邮件作为查询参数传递,如登录URL中的参数next
/account/register/?email=user@example.com
如果您的RegistrationView
是标准的FormView
,您可以覆盖get_initial
以获取参数
def get_initial(self):
initial = super(RegistrationView, self).get_initial()
email = self.request.GET.get('email')
if email is not None:
initial['email'] = email
return initial
你把一些事情搞混了 使用
args
和kwargs
传递到reverse
的参数用于构建URL。为了让视图接受这些参数,相应的URL模式必须有一个占位符
看看这个例子:
# urls.py
...
url(r'^/polls/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
...
# views.py
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
>>> reverse('detail', kwargs={'question_id': 123})
'/polls/123/'
您可以使用request.GET
访问视图中的查询参数,在本例中为request.GET.GET('foo')
现在,关于基于类的视图。简单地说,as_view()
是一个错误的位置,用于传递参数,每个请求的参数应该不同。在引擎盖下,表达式RegistrationView.as\u view(form\u class=RegistrationForm)
创建一个工厂函数,该函数为每个请求实例化一个新的RegistrationView实例as\u view()
“存储”它的参数并将它们传递给RegistrationView。\uu初始化\uuu()
TL;医生:
将电子邮件作为查询参数传递,如登录URL中的参数next
/account/register/?email=user@example.com
如果您的RegistrationView
是标准的FormView
,您可以覆盖get_initial
以获取参数
def get_initial(self):
initial = super(RegistrationView, self).get_initial()
email = self.request.GET.get('email')
if email is not None:
initial['email'] = email
return initial
卓越-会话执行本例中我需要的操作,因为我不需要通过查询字符串传递电子邮件。卓越-会话执行本例中我需要的操作,因为我不需要通过查询字符串传递电子邮件。