Django

シフト公開と未公開の切替のためUPDATE機能を実装中(Total:18day60h)

公開・未公開切替機能を実装

スケジュールの公開状態と未公開状態を切替を行うように実行します。

ボタンをクリックしたら、IDと現在の状態を付与してリクエスト

公開か非公開を押下したら、年月IDと現在の状態を送信することでフラグを更新しようと思います。

    <v-btn
      class="ma-2"
      color="primary darken-2"
      dark
      @click="getOpenFlagChaenge(items[0].year_month_id, items[0].open_flg)"
    >
      <p v-if="items[0].open_flg==='公'">
        非公開
      </p>
      <p v-else>
        公開
      </p>
    </v-btn>

これで、IDと現在のフラグの状態を一緒に送信するようにします。

ボタン押下での処理

先ほどのボタン押下した時に、呼び出されるPGです。

  //公開非公開切替
  async getOpenFlagChaenge() {
    const res = await $api.yearmonth.getOpenFlagChaenge({
      id: this.items[0].year_month_id,
      open_flg: this.items[0].open_flg})
  }

IDと状態を付与して、axiosのサービスを呼び出します。

ServiceでURLとmethodを指定する

先ほどのidとフラグの状態を一緒にDjango側にリクエストする。

// 公開フラグ切替
export function getOpenFlagChaenge(data: {id: number, open_flg: string}) {
  return (
    api.request({
      method: 'post',
      url: `api/yearmonth/open_flg_chenge`,
      data
    })
  )
}

これにより、idと公開フラグをdataとして付与して、django側にpostメソッドとしてリクエストする

Django側 urlsの追加

Vueから受け取ったリクエストを処理を追加します

from django.urls import path

from .views import (
    YearMonthAPI,
    YearMonthGetAPI,
    YearMonthNextGetAPI,
    YearMonthOpenFlagChangeAPI,
)

urlpatterns = [
    # 年月トラン作成
    path('yearmonth/new_create/', YearMonthAPI.as_view(), name='yearmonth.create'),
    path('schedule/year_month/<str:today>', YearMonthGetAPI.as_view(), name='scheudule_table'),
    path('schedule/next_year_month/<str:date>', YearMonthNextGetAPI.as_view(), name='next_year_flg'),
    path('schedule/open_flg_chenge', YearMonthOpenFlagChangeAPI.as_view(), name='open_flg_change'), #追加
]

api.pyの最初の処理を追加してリクエスト内容を確認

class YearMonthOpenFlagChangeAPI(APIView): 
    def post(self, request, *args, **kwargs):
        print(self.args, self.kwargs)
        if request.user.is_superuser == True:
            return Response(YearMonthGetAPI())  
        else:
            raise PermissionDenied(
                _('管理者でないので実行できないです。管理者へご連絡ください')
            )

ここで1度、ちゃんとリクエストが来ているか確認

"POST /api/yearmonth/open_flg_chenge HTTP/1.1" 500 102836
() {}
Internal Server Error: /api/yearmonth/open_flg_chenge

あれ?付与データが何もきていない…
きてない…

なんで?

POSTは作成指示、PUTが更新処理

基本でしたが、間違っていました💦

// 公開フラグ切替
export function getOpenFlagChaenge(data: {id: number, open_flg: string}) {
  return (
    api.request({
      method: 'put', //putに変更
      url: `api/yearmonth/open_flg_chenge`,
      data
    })
  )
}
class YearMonthOpenFlagChangeAPI(APIView): 
    def put(self, request, *args, **kwargs):
        print(args, kwargs)
        if request.user.is_superuser == True:
            return Response(YearMonthGetAPI())  
        else:
            raise PermissionDenied(
                _('管理者でないので実行できないです。管理者へご連絡ください')
            )
[27/Dec/2021 20:07:36] "PUT /api/yearmonth/open_flg_chenge HTTP/1.1" 405 64

Putでリクエストはいってるけど、やっぱりリクエストに付与したデータが取得できていない

Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
() {}

Update用のAPIを利用するように変更してどうにかできないかやってみる。

class YearMonthOpenFlagChangeAPI(generics.UpdateAPIView):
    queryset = YearMonth.objects.all()
    serializer_class = YearMonthSerializer
    model = YearMonth
    
    def put(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        print(serializer)
        if request.user.is_superuser == True:
            return Response(YearMonthGetAPI())  
        else:
            raise PermissionDenied(
                _('管理者でないので実行できないです。管理者へご連絡ください')
            )
    
    def get_queryset(self):
        queryset = YearMonth.objects.filter(year_month_id=id)

これでリクエストを送ったら、めっちゃたくさんデータがプリントされた!

長いので最初の1部だけ貼り付けます。

YearMonthSerializer(context={'request': <rest_framework.request.Request: PUT '/api/yearmonth/open_flg_chenge'>, 'format': None, 'view': <schedule.views.yearmonth.api.YearMonthOpenFlagChangeAPI object>}, data={'id': 167, 'open_flg': '公'}):
    year_month_id = IntegerField(label='年月ID', read_only=True)
    year_month = IntegerField(label='年月', max_value=2147483647, min_value=-2147483648)

これで、dataも来ているようにみえますねー!

明日からは、公開未公開のさらに実装を進めたいと思います(⌒∇⌒)

-Django

© 2022 ごろう@縁紡ぐ