Django DateField только с месяцем и годом - PullRequest
0 голосов
/ 04 сентября 2018

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

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

Сначала я начал использовать некоторый javascript для этого, затем поиграл с пользовательской моделью Django (для подкласса моделей. DateField).

Мне не удалось сделать это позже ( мой пост обновлен, связанный с этим ) Поскольку у меня есть сроки, я сделал это с помощью простого ChoiceField, хранящего объекты в виде целых чисел, а затем, используя метод @property, чтобы построить правильную дату из этих пользовательских вводимых данных (добавьте 1 как день).

Таким образом, я избежал глубокого погружения в паровые трубы Джанго и даже избавился от сборщика дат!

Но благодаря @property я все еще могу сохранять удобство форматирования дат в шаблонах Django, вычисления даты и т. Д. *

models.py:

ПРИМЕЧАНИЕ: используйте для возврата None, если дата не может быть построена из заполненных полей, в противном случае у вас будет несвязанная ошибка при попытке отобразить эти поля @property в шаблоне.

class MyModel(models.Model):

    YEAR_CHOICES = [(y,y) for y in range(1968, datetime.date.today().year+1)]
    MONTH_CHOICE = [(m,m) for m in range(1,13)]

    start_year = models.IntegerField(choices=YEAR_CHOICES,
                 default=datetime.datetime.now().year,)
    start_month = models.IntegerField(choices=MONTH_CHOICE,
                  default=datetime.datetime.now().month,)
    end_year = models.IntegerField(choices=YEAR_CHOICES,
               default=datetime.datetime.now().year,)
    end_month = models.IntegerField(choices=MONTH_CHOICE,
                default=datetime.datetime.now().month,)

    @property
    def start_date(self):
        if self.start_year and self.start_month:
            return datetime.date(self.start_year, self.start_month, 1)
        elif self.start_year:
            return datetime.date(self.start_year, 12, 31)
        else:
            return None

    @property
    def end_date(self):
        if self.end_year and self.end_month:
            return datetime.date(self.end_year, self.end_month, 1)
        elif self.end_year:
            return datetime.date(self.end_year, 12, 31)
        else:
            return None

forms.py

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        exclude = ("blabla",)

Теперь, если вы хотите отобразить дату в шаблоне формы, вы можете использовать:

{{ form.instance.start_date }}

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

...