1

我在我的项目中有API,需要在响应中翻译一些数据。Django Rest Framework i18n在GET上工作,但在POST上不起作用

所以我有模式:

class Ticket(models.Model): 
    NEW = 'new' 
    CONFIRMED = 'confirmed' 
    USED = 'used' 
    CANCELED = 'canceled' 

    STATUS_CHOICES = (
     (NEW, _('New')), 
     (CONFIRMED, _('Confirmed')), 
     (USED, _('Used')), 
     (CANCELED, _('Canceled')), 
    ) 

    service_subscription = models.ForeignKey(ServiceSubscription) 
    price = models.DecimalField(max_digits=11, decimal_places=2, null=True, blank=True) 
    ticket_order = models.ForeignKey(TicketOrder) 
    begin_stamp = models.DateTimeField() 
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, default=NEW) 
    code = models.CharField(max_length=36, null=True, blank=True) 
    created = models.DateTimeField(default=timezone.now) 
    changed = models.DateTimeField(auto_now=timezone.now) 
    processed_by = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True) 

串行该案例:

class TicketViewSetSerializer(serializers.ModelSerializer): 
    status = serializers.SerializerMethodField() 

    class Meta: 
     model = Ticket 
     fields = ('begin_stamp', 'status', 'changed') 

    def get_status(self, obj): 
     return obj.get_status_display() 

而且我视图集中在那里我称之为:

class TicketViewSet(viewsets.ModelViewSet): 
    queryset = Ticket.objects.all() 
    serializer_class = TicketViewSetSerializer 
    permission_classes = (IsAuthenticated, IsCorpMember) 

    @list_route(methods=['get', 'post'], url_path='check/(?P<event_schedule_pk>[0-9]+)') 
    def check_ticket(self, request, event_schedule_pk, *args, **kwargs): 

     event_schedule = get_object_or_404(EventSchedule, pk=event_schedule_pk) 

     data = {} 
     status = 200 

     if request.method == "POST": 
      # get ticket code 
      code = request.data.get('code') 
      try: 
       ticket = self.queryset.select_for_update().filter(
        code=code, begin_stamp=event_schedule.start, service_subscription__data__jcontains={'id': event_schedule.event_id})[0] 
      except IndexError: 
       return HttpResponseNotFound(ugettext('Code invalid or ticket is not for this event')) 

      if ticket.status == 'confirmed': 
       ticket.status = 'used' 
       ticket.processed_by = request.user 
       ticket.save() 

      else: 
       status_msg = { 
        'new': ugettext('Need to be paid firstly'), 
        'used': ugettext(u'Already used'), 
        'canceled': ugettext('Ticket is canceled') 
       } 
       data['message'] = status_msg.get(ticket.status) 
       status = 400 

      ticket_serializer = TicketViewSetSerializer(ticket) 
      data['ticket'] = ticket_serializer.data 

     event_schedule_serializer = EventScheduleCorpSerializer(event_schedule) 
     data['event_schedule'] = event_schedule_serializer.data 

     return Response(data, status=status) 

和urls.py

router = routers.DefaultRouter() 
router.register(r'ticket', views.TicketViewSet) 

我需要根据标题中的用户语言翻译票据状态。当我简单地在GET(/ ticket /)上调用这个视图集时,我获得了状态翻译,但是当调用POST时,我使用默认语言获取数据。 (我从django.middleware.locale导入我的中间件类中的LocaleMiddleware)

所以我真的不知道我在做什么错。

回答

0

答案很简单。我错过了一个重要的设置。我只需要将我的区域设置文件夹添加到

LOCALE_PATHS = (
    ---------some existing folders-------------, 
    os.path.join(BASE_DIR, 'ui/Api/locale'), # my folder I missed 
) 

现在一切正常。

相关问题