get_sucess_url 如何在 django 中工作?
Posted
技术标签:
【中文标题】get_sucess_url 如何在 django 中工作?【英文标题】:how does get_sucess_url work in django? 【发布时间】:2014-05-03 20:03:25 【问题描述】:我正在经历django-registration
的source code
。这是定义的基于类的视图。我很难理解get_success_url
是如何工作的?
来自documentation,
get_success_url()
Determine the URL to redirect to when the form is successfully validated.
Returnsdjango.views.generic.edit.ModelFormMixin.success_url if it is provided;
otherwise, attempts to use the get_absolute_url() of the object.
但是在下面的示例代码中这是如何工作的:
为什么是two arguments empty
?他们应该采取什么措施?
class ActivationView(BaseActivationView):
def activate(self, request, activation_key):
"""
Given an an activation key, look up and activate the user
account corresponding to that key (if possible).
After successful activation, the signal
``registration.signals.user_activated`` will be sent, with the
newly activated ``User`` as the keyword argument ``user`` and
the class of this backend as the sender.
"""
activated_user = RegistrationProfile.objects.activate_user(activation_key)
if activated_user:
signals.user_activated.send(sender=self.__class__,
user=activated_user,
request=request)
return activated_user
def get_success_url(self, request, user):
return ('registration_activation_complete', (), )
【问题讨论】:
【参考方案1】:这三个参数被传递给 Django 的reverse URL lookup,特别是django.core.urlresolvers.reverse
函数。 ()
(空元组)给出位置参数,(空字典)给出关键字参数。所以最终通过的是:
reverse('registration_activation_complete', args=(), kwargs=)
您可以在urls.py 文件中看到registration_activation_complete
URL 不带参数(URL 只是activate/complete/$
),这就是为什么它们是空的。
【讨论】:
如果我是正确的,get_success_url
仅在表单成功验证时才被调用。那么当它没有被验证时叫什么?有get_failure_url
吗?
@eagertoLearn:如果表单未成功验证,默认情况下它会执行 Django 中无效表单的操作(返回表单页面,并在表单中添加一些错误消息)。如果你想定制它,你可以实现一个form_invalid
方法(参见here)。如果您愿意,该方法可以将 HttpResponseRedirect 返回到新的 URL(尽管目前尚不清楚您为什么会这样做——当有人注册失败时,您通常不会将他们发送到 new 页面)
谢谢!我一直在尝试将不同的url
传递给get_success_url
,这将需要参数,我在这里以不同的方式发布了这些参数。看起来这不是微不足道的(至少对我来说)。 ***.com/questions/22622738/…
@eagertoLearn:您可以传递不同的url
,但看起来您正在尝试在该get_success_url
页面上显示失败消息。为什么不通过表单验证来处理这个问题?即如果注册失败,引发ValidationError?
我想为模板传递一个需要参数(如account
)的不同url。这实际上不是表单验证(因为用户通过单击发送到电子邮件的链接来激活他的帐户,如果由于某种原因链接已过期,那么我想显示不同的消息。单个模板取决于帐户是否被激活应该同时处理(如果您查看其他帖子,您可能会看到,我为account being active
做了一个if
签入模板以上是关于get_sucess_url 如何在 django 中工作?的主要内容,如果未能解决你的问题,请参考以下文章
Django:如何在 Django 表单中多次包含相同的字段?
Django:如何告诉 Django 它应该在哪里寻找应用程序?