【问题标题】:Reload the page without refreshing with django and ajax使用 django 和 ajax 重新加载页面而不刷新
【发布时间】:2020-01-21 20:42:11
【问题描述】:

我正在开发一个使用 Django 来检查加密货币价格的网站。 我想加载存储在 django sqlite3 数据库文件中的值而不使用 ajax 刷新(F5)。我该怎么办?

(但是,如果用户手动刷新页面,值会发生变化。这是因为该值是从数据库中加载的。)

爬虫会自动收集加密货币价格和其他信息,并实时存储在您的Django项目中的db.sqlite3中。

index.html(这个HTML模板是静态的,它的值不会实时变化。)

{% extends 'exchange/layout.html' %}
{% load humanize %}
{% block title %}XCoin{% endblock %}
{% block body %}
<table class="table table-condensed">
 <thead>
   <tr>
      <th>#</th>
      <th>Name</th>
      <th>Price</th>
      <th>Market Cap</th>
      <th>Volume (24h)</th>
      <th>Circulating Supply</th>
   </tr>
 </thead>
 <tbody>
   {% for coin in coins %}
   <tr>
      <td>{{coin.ranking}}</td>
      <td>[ {{coin.abbreviation}} ]  {{coin.name}}</td>
      <td>{{coin.price|intcomma}}$</td>
      <td>{{coin.marketcap|intcomma}}$</td>
      <td>{{coin.volume|intcomma}}$</td>
      <td>{{coin.circulatingsupply|intcomma}} {{coin.abbreviation}}</td>
   </tr>
   {% endfor %}
 </tbody> 

</table>
{% endblock %}

urls.py

from django.contrib import admin
from django.urls import path
from . import views

app_name = 'exchange'
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index, name='home'),
]

models.py

from django.db import models

class Coin(models.Model):
    ranking = models.IntegerField() # coin ranking
    abbreviation = models.CharField(max_length=10) # coin symbol
    name = models.CharField(max_length=20) # coin name
    price = models.FloatField() # coin price ($)
    marketcap = models.IntegerField() # coin marketcap ($)
    volume = models.IntegerField() # coin volume (24h)
    circulatingsupply = models.IntegerField() # coin supply

    def __str__(self):
        return self.name

views.py

from .models import Coin
from django.shortcuts import render
from django.shortcuts import HttpResponse

def index(request):
    coin = Coin.objects.all()
    context = {'coins':coin}
    return render(request, 'exchange/index.html', context)

【问题讨论】:

  • 一种方法是创建一个 API 端点,您可以在其中获取最新价格,然后使用 JS 您可以刷新 HTML 中的价格,而无需重新加载整个页面。您还可以设置一个 JS 计时器,在固定或随机间隔内触发价格。
  • 从您显示的代码中,您应该有一个比“我应该怎么做?”更具体的问题。你坚持哪个具体部分?
  • 首先第一个建议是不要在模型的每个属性之后使用这样的 cmets。很明显,硬币模型内部的价格属性将是硬币价格。第二一个简单的谷歌搜索术语,如“Django with Ajax”,将对您有所帮助

标签: javascript python jquery django ajax


【解决方案1】:

我会做的是创建一个 api,它会给我带来(动态)价值。 然后通过 react/angular 或任何最适合您的方式创建一个在屏幕上显示值的事件(也是动态的),但不从视图中的上下文呈现该值,从同一个 JS 呈现它。

顺便说一句,我建议使用 CBV 而不是 FBV。

【讨论】:

    【解决方案2】:

    最简单的解决方案是创建一个包含数据的视图和一个充当框架的视图。在框架视图中设置一个计时器,然后使用 jQuery.load() (https://api.jquery.com/load/)

    一个例子是:

    var l_url = '/path/to/data_view'
    var l_html = $('div#test-load');
    l_html.load(l_url,function(data,status,jqXGR){
       //add some additional processing here if you want to process the returned data
       //if your data_view is designed correclty you shouldn't need it
    }
    

    使用 api 并从数据库中提取数据(如上面的帖子中所建议的那样)是更好的选择。

    【讨论】:

    • 这是最简单最容易实现的方法。谢谢。
    • 这就是我们实现所需功能的方式。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多