在 Django 中集成自定义函数
Integrating a custom function in Django
我想在我的 Django 网站上访问和打印由 ERDDAP 服务器提供的元数据(属性和值),它是 OPeNDAP 的变体。
所以我准备了一个名为 get_conventions
的简单示例函数来访问此 public 服务器上托管数据和元数据的元数据字段。首先,我安装所需的包:
$ pip install pandas erddapy
然后,
import pandas as pd
from erddapy import ERDDAP
def get_conventions(dataset_id):
e = ERDDAP(server='https://gliders.ioos.us/erddap/', protocol='tabledap', response='csv')
url = e.get_info_url(dataset_id, response='csv')
df = pd.read_csv(url)
# this replace spaces with underscores in column names
df.columns = [col_name.replace(' ', '_') for col_name in df.columns]
conventions = df[df.Attribute_Name == 'Conventions'].Value
return conventions
使用 Python 解释器,可以使用此样本数据集 ID 作为参数 (amelia-20180501T0000) 调用函数,该数据集 ID 可在 the server 上找到;输出如下:
>>> get_conventions('amelia-20180501T0000')
6 Unidata Dataset Discovery v1.0, COARDS, CF-1.6
Name: Value, dtype: object
>>>
我希望我的网站在网页上打印上述函数的输出。
我可以在页面中打印参数字符串(model.py、views.py 和相关的 html 模板 - 类似于 Django tutorial),但是我我不确定如何将参数引用到函数(并期望 return)或 how/where 以将函数集成到 Django 结构中。
参数存储在本地数据库中,可以使用models/views/template
引用
但是我不知道如何在Django中集成涉及功能的部分?
该方法将取决于该功能是要在单个应用程序中使用 cross-app,还是绑定到 Django 模型。
对于 cross-app 功能,我通常会为每组功能创建一个名为 core 或 utils 的单独应用程序,其中包含 python 文件。为了您的示例,我们将其称为 erddapy.py
。在您的视图所在的 views.py
中,只需 from utils.erddapy import get_conventions
并在传入参数的视图中调用它。然后 return 结果作为模板的上下文。
如果它仅在单个应用程序中使用但未绑定到模型,您还可以在该应用程序中创建一个 utils.py 文件,而不是在您的 views.py
中执行 from .utils import get_conventions
然后在你看来叫它。
如果您已经为数据集定义了一个模型并将数据集 ID 存储在那里,它可能更适合模型方法。这样您就可以在视图中使用查询集 API 来获取实例,然后只需调用 instance.get_conventions()
。这种方法不需要参数,因为您可以简单地从方法逻辑中的 self.dataset_id
获取数据集 ID。
# view
id = self.kwargs.get('id')
if id:
instance = get_object_or_404(MyModel, id=id)
data = instance.get_conventions()
# return the data as context in an http response
# model method
class MyModel(models.Model):
# model fields
def get_conventions(self):
dataset_id = self.dataset_id
# get the data
我想潜在的问题是您如何存储或获取数据集 ID?如果它在单独的本地数据库中,您可能需要查询它以获取我将在单独的函数中执行的数据集 ID。然后要么将它作为参数传递给函数,要么将它作为模型实例存储在 Django 数据库中,并使用上面解释的方法。
我在阅读 this, by D. Patel 后完成了这项工作。
它涉及将以下内容添加到名为 services.py
的文件中,该文件位于名为 templatetags
的应用子文件夹中。这是 get_conventions
自定义函数所在的位置:
from django import template
...
register = template.Library()
@register.filter
def get_conventions(dataset_id):
...
return conventions
并且在模板中,我必须加载 services
文件并将以下内容添加到 html 模板:
{% load services %}
{% block content %}
<p><strong>Conventions:</strong> {{ station.dataset_id | get_conventions }}</p>
...
{% endblock %}
station.dataset_id
是 get_conventions 函数的参数 |
与 return 值
并且它按预期工作。非常简单。
我想在我的 Django 网站上访问和打印由 ERDDAP 服务器提供的元数据(属性和值),它是 OPeNDAP 的变体。
所以我准备了一个名为 get_conventions
的简单示例函数来访问此 public 服务器上托管数据和元数据的元数据字段。首先,我安装所需的包:
$ pip install pandas erddapy
然后,
import pandas as pd
from erddapy import ERDDAP
def get_conventions(dataset_id):
e = ERDDAP(server='https://gliders.ioos.us/erddap/', protocol='tabledap', response='csv')
url = e.get_info_url(dataset_id, response='csv')
df = pd.read_csv(url)
# this replace spaces with underscores in column names
df.columns = [col_name.replace(' ', '_') for col_name in df.columns]
conventions = df[df.Attribute_Name == 'Conventions'].Value
return conventions
使用 Python 解释器,可以使用此样本数据集 ID 作为参数 (amelia-20180501T0000) 调用函数,该数据集 ID 可在 the server 上找到;输出如下:
>>> get_conventions('amelia-20180501T0000')
6 Unidata Dataset Discovery v1.0, COARDS, CF-1.6
Name: Value, dtype: object
>>>
我希望我的网站在网页上打印上述函数的输出。
我可以在页面中打印参数字符串(model.py、views.py 和相关的 html 模板 - 类似于 Django tutorial),但是我我不确定如何将参数引用到函数(并期望 return)或 how/where 以将函数集成到 Django 结构中。
参数存储在本地数据库中,可以使用models/views/template
引用但是我不知道如何在Django中集成涉及功能的部分?
该方法将取决于该功能是要在单个应用程序中使用 cross-app,还是绑定到 Django 模型。
对于 cross-app 功能,我通常会为每组功能创建一个名为 core 或 utils 的单独应用程序,其中包含 python 文件。为了您的示例,我们将其称为 erddapy.py
。在您的视图所在的 views.py
中,只需 from utils.erddapy import get_conventions
并在传入参数的视图中调用它。然后 return 结果作为模板的上下文。
如果它仅在单个应用程序中使用但未绑定到模型,您还可以在该应用程序中创建一个 utils.py 文件,而不是在您的 views.py
中执行 from .utils import get_conventions
然后在你看来叫它。
如果您已经为数据集定义了一个模型并将数据集 ID 存储在那里,它可能更适合模型方法。这样您就可以在视图中使用查询集 API 来获取实例,然后只需调用 instance.get_conventions()
。这种方法不需要参数,因为您可以简单地从方法逻辑中的 self.dataset_id
获取数据集 ID。
# view
id = self.kwargs.get('id')
if id:
instance = get_object_or_404(MyModel, id=id)
data = instance.get_conventions()
# return the data as context in an http response
# model method
class MyModel(models.Model):
# model fields
def get_conventions(self):
dataset_id = self.dataset_id
# get the data
我想潜在的问题是您如何存储或获取数据集 ID?如果它在单独的本地数据库中,您可能需要查询它以获取我将在单独的函数中执行的数据集 ID。然后要么将它作为参数传递给函数,要么将它作为模型实例存储在 Django 数据库中,并使用上面解释的方法。
我在阅读 this, by D. Patel 后完成了这项工作。
它涉及将以下内容添加到名为 services.py
的文件中,该文件位于名为 templatetags
的应用子文件夹中。这是 get_conventions
自定义函数所在的位置:
from django import template
...
register = template.Library()
@register.filter
def get_conventions(dataset_id):
...
return conventions
并且在模板中,我必须加载 services
文件并将以下内容添加到 html 模板:
{% load services %}
{% block content %}
<p><strong>Conventions:</strong> {{ station.dataset_id | get_conventions }}</p>
...
{% endblock %}
station.dataset_id
是 get_conventions 函数的参数 |
与 return 值
并且它按预期工作。非常简单。