【问题标题】:Ouput ping status on django template在 django 模板上输出 ping 状态
【发布时间】:2019-10-06 15:12:51
【问题描述】:

我有一个模型,其中包含我需要 ping 的域名。我能够创建视图,但不知道如何在模板上输出它。

def index(request, page):
  template = "home.html"
  if request.method == 'POST':
      csv_file = request.FILES['file']
      if not csv_file.name.endswith('.csv'):
          messages.error(request, 'Please upload a .csv file.')

      data_set = csv_file.read().decode('ISO-8859-1')
      io_string = io.StringIO(data_set)
      next(io_string)
      for column in csv.reader(io_string, delimiter=','):
          _, created = Table.objects.update_or_create(
              page=column[0],
              keyword=column[1],
              interval=column[2],
              email=column[3],
              notes=column[4],
              billing=column[5],
          )
  page_object = get_object_or_404(Table, page=page)
  try:
      subprocess.check_call(['ping', '-c', '1', page_object.page])
  except subprocess.CalledProcessError:
      host_online = False
  else:
      host_online = True
  context = {
      'tables': Table.objects.all(),
      'online': host_online,
      'page': page
  }
  return render(request, template, context)

模型

class Table(models.Model):
  page = models.URLField(verbose_name=None)

这就是我在模板上的称呼

{% if online %}
  <i class="small material-icons green-text">check_circle</i>
{% else %}
  <i class="small material-icons red-text">close</i>
{% endif %}

谁能指导我? 它正在返回data_upload() missing 1 required positional argument: 'page'

【问题讨论】:

  • 您没有将context 传递给模板。
  • @WillemVanOnsem 我刚刚做了,但是当我循环浏览它时,桌子不见了。
  • 那么t 是什么?
  • 来自模型的迭代

标签: django django-models django-templates django-views


【解决方案1】:

您的代码中有几个问题导致它不正确:

  • domain = Table.objects.filter(page) 将失败。你应该做domain = Table.objects.filter(page=page)
  • 您实际上并没有 ping 域,因为 domain 只是代码中的一个字符串 subprocess.check_call(['ping', '-c', '1', "domain"])
  • 你没有使用上下文:如果你想在模板中访问它,你需要将它传递给render调用: return render(request, 'home.html', context)

更重要的是,Django 的 filter 函数返回一个 queryset 对象,而不是单个实体。

我的建议是按如下方式修复您的代码:

views.py

from django.shortcuts import get_object_or_404


def pingDomain(request, page):
  page_object = get_object_or_404(Table, page=page)
  try:
      subprocess.check_call(['ping', '-c', '1',  page_object.page])
  except subprocess.CalledProcessError:
      host_online = False
  else:
      host_online = True
  context = {
      'online': host_online
  }
  return render(request, 'home.html', context) 

然后在您的模板中,您可以简单地通过online 键访问它:

{{online}}

【讨论】:

  • 模板上没有输出。我还迭代了 {% for o in online %} {{o.online}} {% endfor %} 但仍然没有在模板上打印任何代码。
  • 因为online 是不可迭代的,你不能迭代它。它只是一个页面的状态
  • 我目前在模型页面上有 6 个项目。即使我不对其进行迭代,它也不会显示任何输出。
  • 您的代码中的page 是什么?它是代表domain(网页)还是代表对象页面?提供页面参数的示例
  • 在您的模板中,您有一个域列表。但所讨论的视图一次只处理一个域。您如何从模板中请求此视图?在我看来,呈现该列表的视图和 ping 页面的视图是 不同 视图。如果是这样,您应该在呈现列表的同一视图中 ping 域
猜你喜欢
  • 1970-01-01
  • 2014-03-14
  • 2018-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 2020-05-12
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多