Django - изменение статического представления на динамическое при повторном запуске только одного id в списке restframework
Я написал статический код для приложения django, где пользователь выбирает формат времени (DD-MM-YYYY или MM-DD-YYY) date & time, который возвращает время в таком формате, но я использую условный оператор для каждого формата времени, я хочу, чтобы он был динамическим, когда добавляется дополнительный формат (YYYY-MM-DD) Я не хочу создавать другой условный оператор. Я не хочу создавать дополнительное поле модели в базе данных. Есть ли способ сделать его динамическим, я пробовал, но не смог понять.
А также в api я конвертирую время в соответствии с выбранным часовым поясом я не смог получить дату и время для всех пользователей он возвращает только одного пользователя с временем.Когда я использую обычный метод django restframework он возвращает всех пользователей без времени.In detail View я могу получить время для отдельных пользователей отдельно
API: models.py:
from django.db import models
import pytz
from django.db import models
import datetime
from django.shortcuts import reverse
from django.utils import timezone
from datetime import datetime
from django.conf import settings
from django.utils.text import slugify
TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones))
CHOICES =(('DD-MM-YYYY','DD-MM-YYYY'),('MM-DD-YYYY','MM-DD-YYYY'),('DD-MM-YYYY HH-MM','DD-MM-YYYY HH-MM'),
('MM-DD-YYYY HH-MM','MM-DD-YYYY HH-MM'))
class Userbase(models.Model):
username = models.CharField('username', max_length=155)
slug = models.SlugField(editable=False)
email = models.EmailField(max_length=155)
# is_created = models.BooleanField(default=True)
# is_active = models.BooleanField(default=True)
my_date= models.CharField('Date',choices=CHOICES,max_length=60)
# my_date_time = models.DateTimeField('Date & Time', default=timezone.now)
timezone = models.CharField(max_length=60, choices=TIMEZONES)
# @property
# def publishdate(self):
# return self.my_date_time.strftime('%Y/%m')
class meta:
verbose_name ='Userbase'
verbose_plural = 'Userbase'
def __str__(self):
return self.username
def save(self, *args, **kwargs):
self.username = self.username.lower()
self.slug = slugify(self.username)
super(Userbase, self).save(*args, **kwargs)
views.py
from datetime import date
from django.db.models.query_utils import Q
from django.http import request
from django.http.response import JsonResponse
from django.shortcuts import get_object_or_404
from rest_framework import generics, mixins, serializers
from rest_framework.decorators import api_view
from rest_framework.fields import JSONField
from rest_framework.response import Response
from rest_framework.views import APIView
from app.models import Userbase
import datetime
from .serializers import UserSerializer
import pytz
from rest_framework import viewsets
from rest_framework import status
from rest_framework.renderers import JSONRenderer
@api_view(['GET', 'POST'])
def data_list(request, *args, **kwargs):
if request.method == 'GET':
#user = Userbase.objects.all()
#serializer = UserSerializer(user, many=True)
#return Response(serializer.data)
user = Userbase.objects.all()
for user in user:
# print(user.email)
# for user in user.values('id','email','timezone','username','my_date'):
# id= user['id']
# username= user['username']
# email= user['email']
# timezone= user['timezone']
# my_date = user['my_date']
email=user.email
timezone = user.timezone
username = user.username
email = user.email
id = user.id
my_date = user.my_date
# print(my_date)
# zone = user.timezone
# print(zone)
my_format = my_date
# pair=[]
# print(id)
user_time = datetime.datetime.now(tz=pytz.timezone(timezone))
print(user_time.tzinfo)
if my_date == 'DD-MM-YYYY':
fmt = '%d-%m-%Y %I:%M %p'
else:
fmt = '%m-%d-%Y %I:%M %p'
my_date = user_time.strftime(fmt)
print(my_date)
print(email)
print(username)
mydate= my_date
return Response({'id':id ,'username':username,'email':email, 'date':mydate,'format': my_format,'timezone': timezone}, status=status.HTTP_200_OK)
urls.py
from django.urls import path
from .views import data_list, data_detail
app_name = 'api'
urlpatterns =[
path('', data_list, name='getdata'),
path('<slug:slug>/', data_detail, name='getdata')
]
serializers.py
from rest_framework import serializers
from django.utils.text import slugify
from rest_framework.fields import ReadOnlyField
from app.models import Userbase
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Userbase
# fields ='__all__'
# extra_kwargs = {'slug': {'read_only': True}}
fields = ['id','username', 'email', 'my_date','timezone']
lookup_field = 'slug'
2.APP часть, где я хотел сделать его динамическим и хотел отобразить время в UI
модуль приложения
forms.py
from django import forms
from django.utils.regex_helper import Choice
from .models import CHOICES, Userbase
import pytz
class Userform(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(Userform, self).__init__(*args, **kwargs)
self.fields['username'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder': 'john'})
self.fields['email'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder': 'john@accenture.com', 'name': 'email', 'id': 'id_email'})
self.fields['timezone'].widget.attrs.update(
{'class': 'form-control mb-3', 'name': 'timezone', 'id': 'id_timezone', 'placeholder':'timezone'})
self.fields['my_date'].widget.attrs.update(
{'class': 'form-control mb-3', 'placeholder':'Select Timeformat','name': 'my_date', 'id': 'id_my_date'})
class Meta:
model =Userbase
fields = '__all__'
urls.py
from django.urls import path
from .views import homeview
app_name= 'app'
urlpatterns = [
path('', homeview, name='home'),
path('<slug:slug>', homeview, name='home')
Здесь я хотел сохранить это как динамическое, а не использовать условный оператор(if user.my_date == 'DD-MM-YYYY':fmt = '%d-%m-%Y' elif user. my_date == 'MM-DD-YYYY': fmt = '%m-%d-%Y' elif user.my_date == 'DD-MM-YYY HH-MM': fmt = '%d-%m-%Y %I:%M %p' else:fmt = '%m-%d-%Y %I:%M %p')
views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Userbase
from .forms import Userform
import pytz
import datetime
from django.utils import timezone
from django.contrib import messages
def homeview(request,slug=None):
my_date=''
userb = Userbase.objects.all()
if request.method == 'GET':
# new
if slug==None:
form = Userform()
# form_mode = 'new'
else: # edit
user = Userbase.objects.get(slug=slug)
# form = Userform(instance = user)
# user = Userbase.objects.get(slug=slug)
print(user.timezone)
zone = user.timezone
print(zone)
# fmt = 'DD-MM-YYYY'
# user_time = datetime.datetime.now(tz=pytz.timezone(zone)).astimezone(pytz.timezone('Asia/Singapore'))
user_time = datetime.datetime.now(tz=pytz.timezone(zone))
print(user_time.tzinfo)
if user.my_date == 'DD-MM-YYYY':
fmt = '%d-%m-%Y'
elif user.my_date =='MM-DD-YYYY':
fmt = '%m-%d-%Y'
elif user.my_date == 'DD-MM-YYY HH-MM':
fmt = '%d-%m-%Y %I:%M %p'
else:
fmt = '%m-%d-%Y %I:%M %p'
my_date = user_time.strftime(fmt)
print(my_date)
form = Userform(instance = user)
# form_mode = 'update'
# post data both adding and updating
else:
if slug==None:
# if id==0:
form = Userform(request.POST)
else:# save from edit
user = Userbase.objects.get(slug=slug)
form = Userform(request.POST, instance=user)
if form.is_valid():
form = form.save(commit=False)
form.save()
else:
messages.error(request, form.errors)
return redirect('app:home')
return render(request, 'home.html', {'form':form, 'userb':userb, 'my_date':my_date})
Заранее спасибо
Вы можете попробовать использовать паттерн фабричного метода.
Видя, что единственный случай использования, который вы описали, это получение 'fmt', как вы его называете, вы можете использовать что-то вроде этого:
class DateFormat():
def __init__(self):
raise NotImplementedError()
def get_format(self):
return self.fmt
class DateFormatFactory():
@staticmethod
def create(format):
if format == 'DD-MM-YYYY':
return DayMonthYearDateFormat()
elif format == 'DD-MM-YYYY HH-MM':
return DayMonthYearHourDateFormat()
elif format == 'MM-DD-YYYY':
return MonthDayYearDateFormat()
elif format == 'MM-DD-YYYY HH-MM':
return MonthDayYearHourFormat()
class DayMonthYearDateFormat(DateFormat):
def __init__(self):
self.fmt = '%d-%m-%Y'
class DayMonthYearHourDateFormat(DateFormat):
def __init__(self):
self.fmt = '%d-%m-%Y %I:%M %p'
class MonthDayYearDateFormat(DateFormat):
def __init__(self):
self.fmt = '%m-%d-%Y'
class MonthDayYearHourDateFormat(DateFormat):
def __init__(self):
self.fmt = '%m-%d-%Y %I:%M %p'
Тогда вы сможете взять нужный формат с помощью одной строки:
DateFormatFactory.create('MM-DD-YYYY').get_format()
DateFormatFactory.create('MM-DD-YYYY HH-MM').get_format()
DateFormatFactory.create('DD-MM-YYYY').get_format()
DateFormatFactory.create('DD-MM-YYYY HH-MM').get_format()