Пользовательское поле Django для обработки поля даты только с месяцем и годом - PullRequest
0 голосов
/ 03 сентября 2018

---------------- РЕДАКТИРОВАТЬ --------------------

Я не смог сделать это с помощью Custom Model Field, и мне пришлось двигаться дальше, поэтому я сделал это альтернативным способом, указанным в конце этого поста.

Вот ссылка на новое сообщение, раскрывающее решение.

---------------- КОНЕЦ РЕДАКТИРОВАНИЯ --------------------

Мое приложение отображает наборы форм, где пользователи могут создавать объекты. После проверки форма набора снова отображается, и пользователь может добавлять новые объекты.

Даты должны быть только месяц и год («% m /% Y»).

Я мог бы поработать над полем ввода (хотя jquery), чтобы добавить '01 / 'перед введенной датой. Но после отправки в поле теперь отображается «% d /% m /% Y» (обычное значение).

Итак, я ищу способ перевода входной строки (например, 09/2018) в dateField для сохранения в базе данных, а затем преобразования этого dateField в строку при получении данных из базы данных.

Я знаю, я мог бы просто использовать форму charfield для месяцев и еще одну для лет.

Но я бы хотел сохранить его как объект даты, поэтому в шаблонах я мог бы выполнять форматирование даты ({{edu.start_date | date: "D, d M, Y"}})

Поля пользовательской модели Django звук, созданный для этого: Поля пользовательской модели Django .

Я мог бы сделать что-то подобное в настраиваемом поле:

def string_to_date(value):
    value = '01/' + value
    la_date = datetime.strptime(value, "%d/%m/%Y").date()
    return la_date

def date_to_string(la_date_date):
    la_date_str = la_date_date.strftime('%m/%Y')
    return la_date_str

class DateYearMonth(models.DateField):
    def get_prep_value(self, value):
        if value is None:
            return value
        return string_to_date(value)

    def to_python(self, value):
        if value is None:
            return value
        return date_to_string(value)

Связанная форма (я прокомментировал виджеты):

class EducationForm(forms.ModelForm):
    start_date =  forms.CharField()
    end_date = forms.CharField()

    class Meta:
        model = Education
        exclude = ("curriculum",)

        #     # les widgets :
       #       widgets = {
        #          'start_date': forms.TextInput(),
        #          'end_date': forms.TextInput(),
#     }

Ну, это пока не работает. Но я даже не знаю, направляюсь ли я в правильном направлении ...

EDIT

На самом деле, возможно, я мог бы использовать простое поле char для месяца и года и добавить модельный метод, который бы создавал из него дату (может быть @property) ... Таким образом, я бы оставил это простым в форме и возможность форматировать по шаблонам ...

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете сделать Год IntegerField и Месяцем (CharField или Integer) и хранить Год в Месяцах индивидуально - это, вероятно, лучшее решение. Ниже приведен пример только для года (от DatetimeField до YearField)

import datetime
    YEAR_CHOICES = []
    for r in range(1980, (datetime.datetime.now().year+1)):
        YEAR_CHOICES.append((r,r))

    year = models.IntegerField(_('year'), choices=YEAR_CHOICES, 
           default=datetime.datetime.now().year)
...