【问题标题】:Django view/html input - Can I force an update using submit when no form update is present?Django 视图/html 输入 - 当没有表单更新时,我可以使用提交强制更新吗?
【发布时间】:2020-05-19 07:00:36
【问题描述】:

当没有表单更新出现时,是否可以使用表单本身的 html 表单强制刷新模板? 这是一个我认为是有效用例的简单示例。

一个视图生成一个随机数:-

def test_random_view(request):
    varid=randint(1,1000)
    context={
        "Randomid": varid
    }
    return render(request ,'test_random.html', {'context': context})

一个简单的页面应该会生成这个随机数:-

This doesn't work<br><br>
Here is a random number: <br>
{{ context.Randomid }}
<form method='get' action=''>
    <input type="text" name="input"  value="Here is an empty field"><br>
    <input type="submit" value="Update the random number"><br>
</form>

但点击提交按钮时,随机数不会更新。我假设这是因为它识别出没有对表单进行更新,因此它不会传递回视图以生成新的随机数。 您可以通过将随机数传递给文本输入来“欺骗”它:-

This sort of works<br><br>
Here is a random number: <br>
<form method='get' action=''>
    <input type="text" name="input"  value={{ context.Randomid }}><br>
    <input type="submit" value="Update the random number"><br>
</form>

但是除了强制表单识别更新并传回视图之外,没有其他理由存在此文本字段。

有什么更好的方法来做到这一点?

我应该在 forms.py 中创建表单,然后在视图中创建表单的实例吗?如果是这样,我如何确保页面会刷新?

是否可以在页面本身中适当地完成?

顺便说一句,此应用程序是让用户从列表中选择一个项目,随机位于选择的顶部,然后单击以进行实际选择,或者重复单击以获取他们想要的任意数量的随机建议。

感谢您的帮助

菲尔

【问题讨论】:

  • 如果我猜对了,你需要一个generate random按钮,和一个submit按钮,你为什么不用JS来生成随机数,因为整个random thing发生在客户端?然后有一个单独的提交按钮,将这个号码发送到您的后端。
  • 谢谢@xpy。我不知道任何JS。随机数需要对应于数据模型中的 id 字段,因此随机检索对象。所以实际的随机数来自一个单独的视图def random_cons_view(): #returns a random constituency id varrandto=constituency.objects.all().count() varrandid=randint(1,varrandto) return varrandid 所以,我在这里使用 Django 来控制随机数的范围,这似乎有效地包含在视图本身中

标签: html django forms view form-submit


【解决方案1】:

如果您想强制刷新页面,您可以简单地使用带有指向该页面的链接的锚标记:

例如,如果您的 urls.py 看起来像这样: ...

path('random/', views.test_random_view, name='random'),

...

您的模板将如下所示:

This doesn't work<br><br>
Here is a random number: <br>
{{ context.Randomid }}
<a href="{% url 'random' %}">Reset</a>

【讨论】:

  • 感谢您抽出宝贵时间回答@Alex_D。蛮力刷新会失去有效的选择,不是吗?所以它会为此工作,我很欣赏,但对于我提到的更广泛的应用程序,用户无法选择其他任何东西。
【解决方案2】:

通常 Django 不会缓存您的视图,任何 GET 请求都应该返回一个新的响应。出于某种原因,您似乎看到了缓存的响应。这可能是您的浏览器,或者介于两者之间的某个服务器(nginx?)。

如果您想防止 Django HTTP 响应被缓存,最简单的方法是使用 never_cache 装饰器对其进行装饰:https://docs.djangoproject.com/en/3.0/topics/http/decorators/#django.views.decorators.cache.never_cache

【讨论】:

  • 所以我在视图顶部添加了from django.views.decorators.cache import never_cache,然后在相关视图之前添加了@never_cache。视图被缓存并不明显,我仍然不知道它为什么会发生。我在“a2hosting.com”托管,也许这就是他们的设置方式。请记住,我对这一切都很陌生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2018-09-04
  • 1970-01-01
  • 2021-09-20
  • 2019-12-18
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多