【问题标题】:How can I Change type Of Django Calendar With Persian Calendar?如何使用波斯日历更改 Django 日历的类型?
【发布时间】:2013-11-29 09:42:14
【问题描述】:

我使用Django 1.6

当我有一个具有DateTimeField 类型的字段时,Django 会自动使用Django calendar

但在Iran 中,我们使用Persian Calendar(或Jalali CalendarFarsi Calendar)。

如何更改 Django 自动生成,因为它会在页面中生成 Persian calendar

另一方面,我想将default calendar 更改为Persian Calendar

【问题讨论】:

  • 你是怎么做到的?我想做同样的事情。

标签: python django persian-calendar


【解决方案1】:

您可以使用django-jalali-date。在管理站点内轻松将 DateTimeFiled 转换为 JalaliDateTimeField。只能通过继承一个类!

settings.py

INSTALLED_APPS = [
    ...
    'jalali_date',
    ...
]

views.py

from jalali_date import datetime2jalali, date2jalali

def my_view(request):
     jalali_join = datetime2jalali(request.user.date_joined).strftime('%y/%m/%d _ %H:%M:%S')

模板.html

{% load jalali_tags %}

<p>{{ request.user.date_joined|to_jalali:'%y/%m/%d _ %H:%M:%S' }}</p>

admin.py

from django.contrib import admin
from jalali_date.admin import ModelAdminJalaliMixin, StackedInlineJalaliMixin, TabularInlineJalaliMixin  

class MyInlines1(TabularInlineJalaliMixin, admin.TabularInline):
    model = SecendModel

class MyInlines2(StackedInlineJalaliMixin, admin.StackedInline):
    model = ThirdModel

@admin.register(FirstModel)
class FirstModelAdmin(ModelAdminJalaliMixin, admin.ModelAdmin):
    inlines = (MyInlines1, MyInlines2, )
    readonly_fields = ('some_fields', 'date_field',)

【讨论】:

  • 请解释如何在模型、视图和模板中使用这个应用程序
  • @Arman 您能否解释一下如何通过此包在模型中实现日期字段。我想知道如何将发布的值作为日期或日期时间字段存储在数据库中。
  • 只是一个fork项目,主项目是django-jallali
  • 你看两个项目的代码了吗?你仓促判断我使用了 jdatetime,没有 django-jalali @eisanahardani
【解决方案2】:

除了已接受的答案之外,Jalali DateField 及其适当的日期选择器也可以在不使用任何自定义 widget 的情况下实现。

首先,您必须指定您的 DateField 以接受其 Jalali 格式的输入。这可以通过this custom model field来实现 :

from django_jalali.db import models as jmodels

class Order(models.Model):
delivery_date =  jmodels.jDateTimeField(verbose_name='تاریخ تحویل')

现在,为了向用户显示日期选择器,您可以使用任何适合您需要的 JavaScript 日期选择器,例如 This Bootstrap Datepicker
假设该字段将显示为 model form, 的一部分,您可以指定负责呈现它的 widgetHTML idclass

class Order(forms.ModelForm):

class Meta:
    model = Order
    widgets = {
        'delivery_date': forms.DateInput(attrs={'id':'datepicker'}),
    }

最后在你的模板中,你只需要初始化日期选择器:

    <script>
    $(document).ready(function() {
        $("#datepicker").datepicker({
            minDate: 2,
            maxDate: "+10D",
            isRTL: true
        });

    });
   </script>

这是最终的样子:

【讨论】:

  • JDateField 似乎使用了 Gregorian DateField 的验证。它会在第二个月的 31 日引起问题。有什么解决方案吗?
【解决方案3】:

您可能必须实现自己的 custom widget - 我认为 Django 目前不提供波斯日历小部件。

我可以找到一个可用的code snippet for a Persian DateTime widget,但尚未测试。如果它不是一个完美的选择,那么希望它能帮助您编写自己的解决方案。

【讨论】:

    【解决方案4】:

    如果你只需要波斯日期字段(例如生日),这个小代码就可以了

    YEAR_CHOICES = range(1377, 1300, -1)
    MONTH_CHOICES = {1: 'فروردین',2: 'اردیبهشت',3: 'خرداد',4: 'تیر',5: 'مرداد',6: 'شهریور',7: 'مهر',8: 'آبان',9: 'آذر',10: 'دی',11: 'بهمن',12: 'اسفند'}
    
    class ProfileUpdate(forms.ModelForm):
        class Meta:
            model = Profile
            fields = '__all__'
    
        def __init__(self, *args, **kwargs):
            super(ProfileUpdate, self).__init__(*args, **kwargs)
            self.fields['birthday'] = forms.DateField(required=False, widget=extras.SelectDateWidget(empty_label=['سال', 'ماه', 'روز'], years=YEAR_CHOICES, months=MONTH_CHOICES))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多