get_sucess_url 如何在 django 中工作?

Posted

技术标签:

【中文标题】get_sucess_url 如何在 django 中工作?【英文标题】:how does get_sucess_url work in django? 【发布时间】:2014-05-03 20:03:25 【问题描述】:

我正在经历django-registrationsource 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 它应该在哪里寻找应用程序?

如何在双连接关系之后在 Django 中执行查询(或:如何绕过 Django 对多对多“通过”模型的限制?)

如何在django查看一个group里的所有user

Django如何使文件在django自动执行

如何在 Django 2 中实现 Django-Private-Chat