【问题标题】:Django: How to link a client-side component with a server-side informationDjango:如何将客户端组件与服务器端信息链接
【发布时间】:2021-04-16 16:57:00
【问题描述】:

我知道标题可能令人困惑,但让我澄清一下我的问题。

我有一个 Animal 模型,其中只有一个 name 字段。 在我的 HTML 模板中,我在 a 元素中列出了 Animal 的每个实例(显示顺序可能会有所不同)。

view.py:

def index(request):
    animals = Animal.objects.all()
    return render(request, 'index.html', {'animals': animals})

index.html:

{% for animal in animals %}
  <a>animal.name</a>
{% endfor %}

输出是这样的:

  • 鸭子
  • 蜜蜂

我的问题是,当用户点击动物时,我必须在数据库中执行某些操作。但是我怎么知道他点击了哪个动物呢?我不想使用 javascript 获取客户端文本,因为这不安全,用户可以通过检查元素来更改它。

我简化了我的动物问题,但实际上它比这更复杂,我真的需要找到一种安全的方法来获得正确点击的动物,即使用户更改了文本或 HTML 类或 ID 或其他东西像这样。

编辑:我不想使用任何其他允许用户从浏览器更改 html 的方法

【问题讨论】:

    标签: django templates model


    【解决方案1】:

    由于您已经在使用锚链接,例如,您可以执行以下操作:

    {% for animal in animals %}
      <a href="{% url 'animal:detail' animal.pk %}">{{ animal.name }}</a>
    {% endfor %}
    

    或使用这样的硬编码网址(不是最佳做法,如果可以,请使用上述方法):

    {% for animal in animals %}
      <a href="/animals/detail/{{ animal.pk }}/">{{ animal.name }}</a>
    {% endfor %}
    

    然后你可以有一个像 /animals/detail/&lt;int:pk&gt;/ 这样的 url 模式,它映射到上面链接的 href 目标。现在,当用户单击该链接时,他们会调用该 url 后面的视图。在这个结果视图中,您可以使用动物的 pk,现在可以从数据库中检索它。

    【讨论】:

    • 我不想这样做,因为每个人都可以从他的浏览器中更改html代码。
    • 是的,但你永远无法阻止。您的 django 视图必须注意该用户是否被允许单击/访问该链接(并执行某些操作)(并返回错误代码)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2013-03-31
    • 2017-07-16
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多