在 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 值

并且它按预期工作。非常简单。