Я пытаюсь решить проблему динамического рендеринга дат UT C на основе часового пояса запрашивающего. После дальнейших исследований кажется, что нет никакого способа получить эту информацию со стороны клиента и преобразовать время ut c на основе этой информации. Похоже, что решением этой проблемы является сохранение информации о часовом поясе на основе ввода пользователя и динамическое изменение настроек часового пояса в проекте django. Я пытался реализовать это, но столкнулся с некоторой ошибкой.
Вот мой код.
Мои settings.py:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'rnd.middleware.TimezoneMiddleware',
]
Это мой пользовательский часовой пояс middleware:
import pytz
from django.utils import timezone
class TimezoneMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(request)
tzname = request.session.get('django_timezone')
if tzname:
timezone.activate(pytz.timezone(tzname))
else:
timezone.deactivate()
return self.get_response(request)
Это мой взгляд:
@login_required
def set_timezone(request):
if request.method == 'POST':
request.session['django_timezone'] = request.POST['timezone']
return redirect('/')
else:
return render(request, 'template.html', {'timezones': pytz.common_timezones})
class ProfileSettings(LoginRequiredMixin,CreateView):
model = SalesExtra
template_name = 'rnd/salessettings.html'
fields = ['contact' , 'outlook_id','outlook_pw','outlook_address','timezone']
exclude = ['comment_id']
def get_context_data(self, **kwargs):
pk = self.kwargs['pk']
context = ''
return context
Это URL:
path('settings-timezone/', views.set_timezone , name = 'set_timezone'),
path('settings/', views.ProfileSettings , name = 'settings'),
Это html:
{% extends 'rnd/base.html' %}
{% load static %}
{%load crispy_forms_tags%}
{% load tz %}
{% get_current_timezone as TIME_ZONE %}
{% block content %}
<form action="{% url 'set_timezone' %}" method="POST">
{% csrf_token %}
<label for="timezone">Time zone:</label>
<select name="timezone">
{% for tz in timezones %}
<option value="{{ tz }}"{% if tz == TIME_ZONE %} selected{% endif %}>{{ tz }}</option>
{% endfor %}
</select>
<input type="submit" value="Set">
</form>
{%endblock content%}
но я столкнулся с этой ошибкой:
TypeError at /settings/
__init__() takes 1 positional argument but 2 were given