51π
Your mistake is using the datetime
class instead of the date
class. You meant to do this:
from datetime import date
date = models.DateField(_("Date"), default=date.today)
If you only want to capture the current date the proper way to handle this is to use the auto_now_add
parameter:
date = models.DateField(_("Date"), auto_now_add=True)
However, the modelfield docs clearly state that auto_now_add
and auto_now
will always use the current date and are not a default value that you can override.
168π
This is why you should always import the base datetime
module: import datetime
, rather than the datetime
class within that module: from datetime import datetime
.
The other mistake you have made is to actually call the function in the default, with the ()
. This means that all models will get the date at the time the class is first defined β so if your server stays up for days or weeks without restarting Apache, all elements will get same the initial date.
So the field should be:
import datetime
date = models.DateField(_("Date"), default=datetime.date.today)
- [Django]-Django dynamic forms β on-the-fly field population?
- [Django]-How to specify an IP address with Django test client?
- [Django]-Constructing Django filter queries dynamically with args and kwargs
- [Django]-Cannot access django app through ip address while accessing it through localhost
- [Django]-Set up a scheduled job?
- [Django]-Django models.py Circular Foreign Key
6π
I think a better way to solve this would be to use the datetime callable:
from datetime import datetime
date = models.DateField(default=datetime.now)
Note that no parenthesis were used. If you used parenthesis you would invoke the now()
function just once (when the model is created). Instead, you pass the callable as an argument, thus being invoked everytime an instance of the model is created.
Credit to Django Musings. Iβve used it and works fine.
- [Django]-Sorting related items in a Django template
- [Django]-Django: Record with max element
- [Django]-Django aggregate or annotate
5π
DateField/DateTimeField.auto_now_add
Automatically set the field to now when the object is first created. Useful for creation of timestamps. Note that the current date is always used; itβs not just a default value that you can override. So even if you set a value for this field when creating the object, it will be ignored.
Source: Django
doc
This should do the trick:
models.DateTimeField(_("Date"), auto_now_add = True)
- [Django]-How to get superuser details in Django?
- [Django]-Django URLs TypeError: view must be a callable or a list/tuple in the case of include()
- [Django]-How do I reference a Django settings variable in my models.py?
4π
You could also use lambda
. Useful if youβre using django.utils.timezone.now
date = models.DateField(_("Date"), default=lambda: now().date())
- [Django]-No module named MySQLdb
- [Django]-FileUploadParser doesn't get the file name
- [Django]-How to check whether the user is anonymous or not in Django?
0π
django hint:
HINT: It seems you set a fixed date / time / datetime value as default for this field. This may not be what you want. If you want to have the current date as default, use django.utils.timezone.now
- [Django]-How do I get user IP address in Django?
- [Django]-Python/Django: how to assert that unit test result contains a certain string?
- [Django]-Django β Website Home Page
0π
I tried the below on Django version 4.1.7 and worked perfectly!
from datetime import datetime, date
class Example(models.Model):
purchase_date = models.DateField(auto_now_add=False, auto_now=False, blank=True)
def __str__(self):
return f"{self.str(purchase_date)}"
Returning this is entirely optional.
Working perfectly either you return the string or not.
- [Django]-Pagination in Django-Rest-Framework using API-View
- [Django]-Add inline model to django admin site
- [Django]-Django composite unique on multiple model fields