django 使用LoginView使用其他参数重定向到下一个URL

fjnneemd  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(120)

我有一个详细页面/spaces/<int:pk>/,未经身份验证的用户可以在其中输入表单数据。
提交表单后,此数据将附加到URL,如下所示:
/spaces/<int:pk>/?product_id=1&start_date=2022-12-23&duration=1
然后,系统会提示用户登录或注册以继续。单击“登录”后,详细信息页url将作为下一个参数追加到登录url中。
/login/?next=/spaces/1/?product_id=14&start_date=2022-12-23&duration=1
但是,登录并重定向回详细信息页面后,URL如下所示:
/spaces/1/?product_id=14
这是因为解析时url与&分开,因此start_dateduration被视为单独的参数。
我能想到的唯一解决方案是重写LoginView.get_redirect_url,并分别附加self.request.GET中的每个参数,但我不确定这是不是最好的方法。
我的目标是保留初始输入数据,以便用户在登录并返回空间详细信息页后不必再次输入。出于转换原因,我不希望强制用户在输入初始表单数据之前登录。
编辑:我正在使用javascript设置登录和注册按钮上的href

const onClick = () => {
  let prodId = document.getElementById('productId').value;
  let startDate = document.getElementById('startDate').value;
  let duration = document.getElementById('duration').value;
  const url = new URL(window.location.href);
  url.searchParams.set('product_id', prodId);
  url.searchParams.set('start_date', startDate);
  url.searchParams.set('duration', duration);
  window.history.replaceState(null, null, url);

  const queryString = window.location.search;
  document.getElementById('login').href = `{% url 'login' %}?next={{request.path}}${queryString}`;
  document.getElementById('register').href = `{% url 'register' %}?next={{request.path}}${queryString}`
}
anauzrmj

anauzrmj1#

您需要正确地对querystring(和路径)进行urlencode编码,因此:

const queryString = encodeURIComponent(window.location.search);
document.getElementById('login').href = `{% url 'login' %}?next={{ request.path|urlencode }}${queryString}`;
document.getElementById('register').href = `{% url 'register' %}?next={{ request.path|urlencode }}${queryString}

相关问题