Django ошибка промежуточного программного обеспечения часового пояса клиента - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь решить проблему динамического рендеринга дат 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
...