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 
) 

이제 모든 것이 잘 작동합니다.

관련 문제