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()
Вернуться на верх