Как изменить тип Django Calendar с персидским календарем?

Я использую Django 1.6.

Когда у меня есть поле с типом DateTimeField, Django автоматически используйте Django calendar.

Но в Iran мы используем Persian Calendar (или Jalali Calendar или Farsi Calendar).

Как я могу изменить генерацию генерации Django, потому что она генерирует Persian Calendar на странице?

В другой руке мне нужно изменить default calendar на Persian Calendar?

enter image description here

Ответ 1

Вам, скорее всего, придется реализовать свой собственный пользовательский виджет - я не думаю, что Django предоставляет виджет с персидским календарем в этот момент времени.

Существует доступный фрагмент кода для виджета Persian DateTime, который я смог найти, но еще не проверил. Если это не идеально подходит, то, надеюсь, это поможет вам написать собственное решение.

Ответ 2

Чтобы добавить к принятому ответу, Jalali DateField с соответствующим выбором даты также может быть реализован без использования каких-либо пользовательских widget.

Сначала вы должны указать свой DateField, чтобы принять его ввод в формате Jalali. Это может быть достигнуто с помощью этого настраиваемого поля модели :

from django_jalali.db import models as jmodels

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

Теперь, для отображения выбора даты для пользователя, вы можете использовать любой желаемый javascript date picker, который соответствует вашим потребностям, что-то вроде This Bootstrap Datepicker.
Предполагая, что поле будет отображаться как часть 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>

Вот как это было бы выглядеть в конце:
Jalali Date Picker

Ответ 3

вы можете использовать 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')

template.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',)

пример результата!

Ответ 4

Если вам просто нужен персидский DateField (например, для дня рождения), этот крошечный код сделает это

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))