【问题标题】:How To Clear self.add_error in Django if user clicks on browser back button?如果用户单击浏览器后退按钮,如何在 Django 中清除 self.add_error?
【发布时间】:2019-11-30 09:46:58
【问题描述】:

我有一个 FORMVIEW,用户从下拉列表中选择一个值,如果他们选择了该值,然后单击提交,它会对 URL 执行 HTTPResponseRedirect,一切都很好。

如果他们忘记输入一个值并单击提交,他们会收到一条错误消息,告诉他们选择一个值。我在表格上做了一个清理以解决这个问题。这一切都很好。

问题是如果用户收到错误消息,然后添加一个值,然后显示所需的输出。如果他们在查看输出后单击浏览器窗口上的后退按钮,仍会显示错误消息。

我已经能够通过在表单中​​包含 NeverCacheMixin 来解决这个问题,但是当用户单击后退按钮时,他们会得到一个丑陋的确认表单重新提交页面。

用户只是在查找一个值,所以也许有更好的方法来解决这个问题?不涉及更新或删除,它严格来说是在一个页面上查找,它对另一个页面执行 HttpResponseRedirect。

这是我的 FORMVIEW...

class AuthorLookupView(LoginRequiredMixin,NeverCacheMixin,FormView):
    form_class = AuthorLookup
    template_name = 'author_lookup.html'

    def form_valid(self, form):
        authorbyname = form.cleaned_data['dropdown']
        return HttpResponseRedirect(reverse('Books:author_detail',kwargs = { 'pk' : authorbyna

me.pk }))

这是我的表格......

class AuthorLookup(forms.Form):

dropdown = forms.ModelChoiceField(queryset=User.objects.none(),required=False)

def __init__(self, *args, **kwargs):
    super(AuthorLookup, self).__init__(*args, **kwargs)
    self.fields['dropdown'].widget.attrs['class'] = 'name'

def clean(self):
    cleaned_data = super(AuthorLookup, self).clean()
    dropdown = cleaned_data.get('dropdown')

    if dropdown:
        pass
    else:
        self.add_error('dropdown','Author is required.')
        pass
    return cleaned_data

在一个完美的世界中,我想在成功清理后删除错误消息,这样如果用户单击浏览器的后退按钮,他们将看到表单而不是看到“剩余”错误消息。有没有办法在成功提交后从浏览器内存中删除错误消息,或者我目前使用 NeverCacheMixin 的工作是解决这个问题的最佳方法?

我意识到我可以让我的 forms.ModelChoiceField 成为必需,但我正在尝试自定义整个应用程序中的错误消息,所以我已经排除了这种可能性。

提前感谢您的任何想法。

【问题讨论】:

  • 你试过通过ajax实现吗?
  • 阿卜杜勒,感谢您的回复。不。我相信如果我在 HTML 中从 Post 更改为 GET,我的问题可以解决。现在解决这个问题。

标签: javascript django django-forms django-templates django-views


【解决方案1】:

所以这个很棘手,因为在某些时候我认为 autocomplete=off 解决了它,但它没有。最终,我发现使用下面的代码实际上解决了我的问题。我可以暂时看到错误消息......但它确实消失了。如果用户点击后退按钮,看起来这是我能做的最好的清除缓存的方法....

    $(window).bind("pageshow", function(event) {
        if (event.originalEvent.persisted) {
            // window.location.reload()
            window.location.reload(true);
        }
    });

经过一天的测试......事实上,我确实必须将 autocomplete="off" 添加回我的项目以用于其他用例,现在我不再看到我报告的错误消息的闪现之前。很难说这是否是巧合。无论哪种方式添加这两个代码似乎都解决了我的问题。 HTML 标头中的 autocomplete="off" 和上面的代码似乎完全解决了我的问题。

HTML...

<form method="GET" autocomplete="off" action="{% url 'your_url_here' %}">

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 2019-09-13
    • 2011-10-15
    • 2014-10-30
    • 2018-06-21
    相关资源
    最近更新 更多