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 import LocaleMiddlewareを持っています)

私は本当に何が間違っているのか分かりません。

答えて

0

答えは簡単でした。私は1つの重要な設定が欠場しています。私のロケールフォルダを追加するだけで

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

となり、すべて正常に機能します。

関連する問題