我用Django 1.6.
当我有一个具有DateTimeField类型的字段时,Django自动使用Django calendar.
但是在Iran我们使用Persian Calendar(或Jalali Calendar或Farsi Calendar)。
如何更改 Django 自动生成,因为它Persian calendar在页面中生成?
另一方面,我想default calendar用Persian Calendar?

我用Django 1.6.
当我有一个具有DateTimeField类型的字段时,Django自动使用Django calendar.
但是在Iran我们使用Persian Calendar(或Jalali Calendar或Farsi Calendar)。
如何更改 Django 自动生成,因为它Persian calendar在页面中生成?
另一方面,我想default calendar用Persian Calendar?

你可以使用django-jalali-date。在管理站点内轻松将 DateTimeFiled 转换为 JalaliDateTimeField。只能通过继承一个类!
设置.py
INSTALLED_APPS = [
...
'jalali_date',
...
]
视图.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>
管理员.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',)
只是为了增加接受的答案,JalaliDateField及其适当的日期选择器也可以在不使用任何 custom 的情况下实现widget。
首先,您必须指定您DateField接受其 Jalali 格式的输入。这可以通过这个自定义模型字段来实现
:
from django_jalali.db import models as jmodels
class Order(models.Model):
delivery_date = jmodels.jDateTimeField(verbose_name='تاریخ تحویل')
现在,为了向用户显示日期选择器,您可以使用任何适合您需要的 JavaScript 日期选择器,例如This Bootstrap Datepicker。
假设该字段将显示为 a 的一部分,model form,您可以指定HTML id或class负责widget呈现它:
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>
这是它最终的样子:

您可能必须实现自己的自定义小部件——我认为 Django 目前不提供波斯日历小部件。
有一个波斯日期时间小部件的可用代码片段,我可以找到它,但尚未测试。如果它不是一个完美的选择,那么希望它能帮助您编写自己的解决方案。
如果您只需要波斯日期字段(例如生日),这个小代码就可以了
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))