modelos example django datetime django-admin datefield

example - datefield django format



¿Solo se muestra el año en django admin, un YearField en lugar de DateField? (4)

Tengo un modelo donde necesito guardar el año de nacimiento. Estoy usando el administrador de Django. La persona que usa esto llenará un montón de personas todos los días, y DateField () muestra demasiado (no está interesado en el día / mes).

Este es un modelo de maqueta que muestra cómo es ahora:

class Person(models.Model): name = models.CharField(max_length=256) born = models.IntegerField(default=lambda: date.today().year - 17)

Como puede ver, la mayoría de las personas tienen 17 años, por lo que estoy recibiendo su año de nacimiento como predeterminado.

¿Puedo hacer esto mejor? ¿Cómo puedo hacer un YearField fuera del DateField? Si hago un YearField, quizás pueda hacer algunas "etiquetas fáciles" como el "ahora" que tiene esa fecha. (Por supuesto, un BornYearField especializado tendría botones fáciles para 1989, 1990, 1991 y otros años comunes)


Además, y esto no es tan relevante para su caso, pero es útil tenerlo en cuenta, no use datetime.date.today (), o datetime.datetime.now () como valores predeterminados. Esto se ejecuta una vez, cuando se inicia el servidor.

Es mucho mejor pasar los callables en:

date = models.DateField(default=datetime.date.today)

Tenga en cuenta que puede usar un lambda para que sea relativo:

date = models.DateField(default=lambda : datetime.date.today() - datetime.timedelta(days=6210))

Por supuesto, esto es ingenuo, y supone que ha habido 5 años bisiestos en los últimos 17 años.


Encontré esta solución que resuelve todo muy elegantemente, creo (no mi código):

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)

Edite el rango de inicio para ampliar la lista :-)


Para una solución que no implique opciones de modelo:

from django.core.validators import MinValueValidator, MaxValueValidator class Person(models.Model): year = models.PositiveIntegerField( validators=[ MinValueValidator(1900), MaxValueValidator(datetime.now().year)], help_text="Use the following format: <YYYY>")

Eso también creará un marcador de posición en el campo de entrada con el valor de help_text .


También puedes hacer esto:

YEARS = ( ("1990", "1990"), ("1991", "1991"), ("1992", "1992"), # P.e. generate a list from 1960 to date.today().year # The reason why they choice key and text value are the # same is that if you generate from 1960 to 2060 it will collide. # # E.g # from datetime import datetime # def tuplify(x): return (x,x) # str(x) if needed # current_year = datetime.now().year # YEARS = map(tuplify, range(1930, current_year + 1)) # range(1,4) gives [1,2,3] ) class Whatever(models.Model): # Show a list with years birthdate = models.IntegerField(max_length=2, choices=YEARS)

Espero que esto ayude.