【问题标题】:Getting Previous URL in Django Form在 Django 表单中获取上一个 URL
【发布时间】:2017-09-12 05:31:07
【问题描述】:

所以我正在尝试构建一些东西,以便用户能够在网站上报告一些东西。这是模型,

class Report(models.Model):
    reporting_url = models.URLField()
    message = models.TextField()

这是视图,

def report(request):
url_report = ???
if request.method == 'POST':
    form = ReportForm(request.POST or None)
    if form.is_valid():
        new_form = form.save(commit=False)
        new_form.reporting_url = url_report
        new_form.save()

我不能使用类似的东西,

url_report = request.get_full_path()

因为我需要创建/编辑多个视图并在这种情况下重复操作。

当我使用类似的东西时,

url_report = request.META.get('HTTP_REFERER')

它返回来自写入 from 的同一页面的 URL。我正在使用类似的东西,

<a href="{% url 'contact:report' %}">Report</a>

从几个不同的应用程序/html_pages 访问报告表单。 如何从用户按下“报告”按钮的位置获取上一页的 URL?

请帮我处理这段代码!

【问题讨论】:

  • @gitblame 这不是上述问题的重复。 OP 知道如何获取先前的 URL,只是不知道如何将其持久化到当前请求之外。

标签: python django


【解决方案1】:

您可以在按下Report 按钮时将引用存储在会话中:

def report(request):
    if request.method == 'GET':
        request.session['report_url'] = request.META.get('HTTP_REFERER')
        # ...
    if request.method == 'POST':
        form = ReportForm(request.POST or None)
        if form.is_valid():
            new_form = form.save(commit=False)
            new_form.reporting_url = request.session.get('report_url')
            new_form.save()

您必须在一个请求-响应周期之后保留此引用。会话是执行此操作的指定方式。另一种选择是将该 url 呈现为隐藏的表单字段,但这很容易被篡改。

【讨论】:

  • 哇,工作得非常好。非常感谢您,先生:)
  • 这可以通过同时打开两个窗口并单独发布帖子来轻松解决。会话充当有状态的单例,但表单是无状态的。最好将 url 存储在隐藏的表单字段中并从那里检索它,因为每个表单都会携带自己的 URL,无论会话状态如何。
  • 毫无疑问:如果用户想作弊,这不是无懈可击的。但无论哪种方式,你都不能保证。 HTTP 引用标头与发布数据一样容易伪造。在正常使用的情况下,这至少会为您提供报告页面上最后一个 GET 的引荐来源网址。
  • @Soviut 先生,您能再解释一下吗?
  • @schwobaseggl 先生,我不明白为什么直接使用它不安全。你能解释一下吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 2019-03-20
  • 2020-08-18
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多