跳转到主要内容

Django模型和管理界面Jalali日期支持

项目描述

此模块为您提供与Django的DateField相同的DateField,但您可以根据Jalali日期获取和查询数据。

状态

https://github.com/slashmili/django-jalali/workflows/Tests/badge.svg?branch=main https://img.shields.io/pypi/v/django_jalali.svg https://img.shields.io/pypi/pyversions/django-jalali.svg https://img.shields.io/pypi/djversions/django-jalali.svg

依赖项

支持的数据库

  • SQLite

  • PostgreSQL

安装

pip install django_jalali

要使用DRF序列化器字段

pip install django_jalali[drf]

用法

  1. 运行

$ django-admin startproject jalali_test
  1. 启动您的应用程序

$ python manage.py startapp foo
  1. 编辑 settings.py 并将 django_jalali 和您的 foo 添加到 INSTALLED_APPS 中(同时配置 DATABASES 设置)

    为了正常工作,django_jalali 应该在您的应用程序之前添加

  2. 编辑 foo/models.py

from django.db import models
from django_jalali.db import models as jmodels


class Bar(models.Model):
    objects = jmodels.jManager()
    name = models.CharField(max_length=200)
    date = jmodels.jDateField()

    def __str__(self):
        return "%s, %s" % (self.name, self.date)


class BarTime(models.Model):
    objects = jmodels.jManager()
    name = models.CharField(max_length=200)
    datetime = jmodels.jDateTimeField()

    def __str__(self):
        return "%s, %s" % (self.name, self.datetime)
  1. 运行

$ python manage.py makemigrations
Migrations for 'foo':
  foo/migrations/0001_initial.py:
     - Create model Bar
     - Create model BarTime
$ python manage.py migrate
Running migrations:
    Applying foo.0001_initial... OK
  1. 测试它

$ python manage.py shell
Python 3.8.18 (default, Nov 26 2018, 15:26:54)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from foo.models import Bar
>>> import jdatetime
>>> today = jdatetime.date(1390, 5, 12)
>>> mybar = Bar(name="foo", date=today)
>>> mybar.save()
>>> mybar.date
jdatetime.date(1390, 5, 12)
>>> Bar.objects.filter(date=today)
[<Bar: foo, 1390-05-12>]
>>> Bar.objects.filter(date__gte="1390-5-12")
[<Bar: foo, 1390-05-12>]
>>> Bar.objects.filter(date='1363-8-01')
[]
>>> from foo.models import BarTime
>>> BarTime(name="Bar Time now", datetime=jdatetime.datetime(1380,8,2,12,12,12)).save()
>>> BarTime.objects.filter(datetime__date=jdatetime.datetime(1380,8,2,12,12,12))
[<BarTime: Bar Time now, 1380-08-0212:12:12>]
>>> BarTime.objects.filter(datetime__date=jdatetime.date(1380,8,2))
[<BarTime: Bar Time now, 1380-08-0212:12:12>]
>>> BarTime.objects.filter(datetime__date="1380-08-02")
[<BarTime: Bar Time now, 1380-08-0212:12:12>]
>>> BarTime.objects.filter(datetime__lt=jdatetime.datetime(1380,8,2,12,12,12))
[]
>>> BarTime.objects.filter(datetime__lte=jdatetime.datetime(1380,8,2,12,12,12))
[<BarTime: Bar Time now, 1380-08-0212:12:12>]
>>> BarTime.objects.filter(datetime__gt='1380-08-02')
[<BarTime: Bar Time now, 1380-08-0212:12:12>]
>>> BarTime.objects.filter(datetime__gt=d)
[]
>>> BarTime.objects.filter(datetime__year=1380)
[<BarTime: Bar Time now, 1380-08-0212:12:12>]

⚠️ __month 过滤器不支持,如在此处解释 这里

使用 Templatetags

  1. 您可以在模板中使用 jformat 过滤器格式化日期

{% load jformat %}
{{ my_date|jformat }} {# default formatting #}
{{ my_date|jformat:"%A %d %B %Y %H:%M" }} {# specific formatting #}

管理界面

  1. 创建 foo/admin.py

from foo.models import Bar, BarTime
from django.contrib import admin

from django_jalali.admin.filters import JDateFieldListFilter

# You need to import this for adding jalali calendar widget
import django_jalali.admin as jadmin


class BarAdmin(admin.ModelAdmin):
    list_filter = (
        ('date', JDateFieldListFilter),
    )


admin.site.register(Bar, BarAdmin)


class BarTimeAdmin(admin.ModelAdmin):
    list_filter = (
        ('datetime', JDateFieldListFilter),
    )


admin.site.register(BarTime, BarTimeAdmin)
  1. 配置管理界面并启动您的 django,享受使用 jalali 日期!

Django rest framework

对于 DRF,存在与 jmodels.JDateFieldjmodels.JDateTimeField 对应的序列化器字段

from django_jalali.serializers.serializerfield import JDateField, JDateTimeField
from rest_framework.serializers import ModelSerializer

from foo.models import Bar, BarTime


class JDateFieldSerialializer(ModelSerializer):
    date = JDateField()

    class Meta:
        model = Bar
        exclude = []

class JDateTimeFieldSerializer(ModelSerializer):
    datetime = JDateTimeField()

    class Meta:
        model = BarTime
        exclude = []

地区设置

为了获取波斯语的日期字符串,您需要将地区设置为 fa_IR

有两种方法可以实现这一点,您可以根据需要选择其中一种方法

  • 以 LC_ALL 环境变量运行服务器

$ LC_ALL=fa_IR python manage.py runserver
  • 在 settings.py 中设置地区

LANGUAGE_CODE = 'fa-ir'
import locale
locale.setlocale(locale.LC_ALL, "fa_IR.UTF-8")

时区设置

django_jalali 版本 3 和 Django 2 开始,您可以使用 TIME_ZONEUSE_TZ 设置 来以项目时区保存日期时间

开发

您可以为此项目做出贡献,通过 GitHub 分支并发送拉取请求。

首先 分支 存储库 并然后克隆它

$ git clone git@github.com:<you>/django-jalali.git

为开发目的初始化虚拟环境

$ python -m venv django_jalali_env
$ source ~/django_jalali_env/bin/activate

然后安装必要的依赖

$ cd django-jalali
$ pip install -r requirements-test.txt

单元测试位于 tests 文件夹中,可以使用 pytest 工具轻松运行

$ pytest

在提交之前,您可以使用 tox 运行所有上述测试以针对所有支持的 Python 和 Django 版本。您首先需要安装 tox

$ pip install tox

然后您可以运行所有测试

$ tox

如果您希望将测试限制为特定的环境,您可以参数化 tox 运行

$ tox -e py39-django42

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

django_jalali-7.1.0.tar.gz (202.0 kB 查看哈希值)

上传时间

构建分布

django_jalali-7.1.0-py3-none-any.whl (213.8 kB 查看哈希值)

上传于 Python 3

支持者