For the majority of my application saving datetimes with the TIME_ZONE and USE_TZ settings are fine. My question is, how can I accomplish saving a model with a datetime that is in UTC, but the datetime is set so that converting back to the users inputted timezone is correct? Model, view, form and html given below. This code will work if USE_TZ = False in the settings.py file, but I would like to keep the timezone for everything else in the project.
Model:
class TZTestModel(models.Model):
timezone = TimeZoneField()
dt = models.DateTimeField()
View:
class TZTestView(LoginRequiredMixin, TemplateView):
template_name = "tz_test.html"
def get_context_data(self, **kwargs):
return {
'form': self.form
}
def dispatch(self, request, *args, **kwargs):
self.form = TZTestForm(self.request.POST or None)
return super(TZTestView, self).dispatch(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
if self.form.is_valid():
self.form.save()
return self.render_to_response(self.get_context_data())
Form:
class TZTestForm(forms.ModelForm):
class Meta:
model = TZTestModel
def clean(self):
timezone = self.cleaned_data['timezone']
dt = self.cleaned_data['dt']
dt = timezone.localize(dt)
self.cleaned_data['dt'] = pytz.UTC.normalize(dt.astimezone(pytz.UTC))
return self.cleaned_data
Template:
<html>
<body>
<form method="post">
{% csrf_token %}
{{ form }}
<input type="submit">
</form>
</body>
</html>
Example:
I would like to be able to enter a timezone of 'US/Alaska' and a datetime of today at 13:00, save that as it's UTC value, then be able to convert back to 'US/Alaska' and get the correct value.
Essentially I am trying to save one model's datetime in a different timezone than my application, where the timezone is specified by the user in the same form that the datetime is specified in.
I have had the same issue with object-level timezones.
I found this blog entry. It's not perfect but it works! and is not too complex. Plus handling the Admin is dealt with.
Pasting the snippets here:
Making sure the form is processed in the wanted timezone:
Displaying correctly in the Admin list view
Interpret correctly the datetimne in Admin Add view
Handling correctly timezones in the Admin edit view
Edit: pastebin source for form field: http://pastebin.com/j4TnnHTS further discussion: https://code.djangoproject.com/ticket/21300
It appears that the way to do this is to create a custom form field that returns a naive datetime, then convert that to the timezone the user specifies, then convert that to UTC.
Custom field:
Form: