2022年8月5日金曜日

django Formで外部キーの内容の選択範囲をフィルタリングするには

https://qiita.com/44d/items/897e5bb20113315af006 を参考にさせていただいた。

マッチングアプリで、「いいね」をお互いに交換できた人のみ、選択できるようにしてみた。
ok_listは、前回考えたアルゴリズムをそのまま利用した。
ポイントは、 form.fields['receiver'].queryset = User.objects.filter(id__in= ok_list(request)) の部分。


@login_required
def dmessage_new(request):
    if request.method == 'POST':
        form = DmessageForm(request.POST)
        if form.is_valid():
            dmessage = form.save(commit=False)
            dmessage.sender = request.user
            dmessage.save()
            return redirect(dmessage_detail, dmessage_id=dmessage.pk)
    else:
        form = DmessageForm()    
        form.fields['receiver'].queryset = User.objects.filter(id__in= ok_list(request))
    return render(request, "dmessages/dmessage_new.html", {'form': form})

def ok_list(request):
          like_list = Matching.objects.filter(  Q(approaching__username__icontains=request.user) )
          liked_list = Matching.objects.filter(  Q(approached__username__icontains=request.user) )
          return (like_list.values_list('approached',flat=True)).intersection(liked_list.values_list('approaching',flat=True))

0 件のコメント:

コメントを投稿