1. ホーム
  2. python

[解決済み] 動的な選択フィールドを作成する

2022-05-30 19:58:22

質問

私は、django で動的な選択フィールドを作成する方法を理解するのに苦労しています。私は次のようなモデルをセットアップしています。

class rider(models.Model):
     user = models.ForeignKey(User)
     waypoint = models.ManyToManyField(Waypoint)

class Waypoint(models.Model):
     lat = models.FloatField()
     lng = models.FloatField()

私がやろうとしていることは、そのライダー(ログインしている人)に関連するウェイポイントを値に持つ選択フィールドを作成することです。

現在、私はこのようにフォームでinitをオーバーライドしています。

class waypointForm(forms.Form):
     def __init__(self, *args, **kwargs):
          super(joinTripForm, self).__init__(*args, **kwargs)
          self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.all()])

しかし、それはすべてのウェイポイントをリストアップするだけで、特定のライダーには関連付けられていません。何かアイデアはありますか?ありがとうございます。

どのように解決するのですか?

フォームのinitにユーザーを渡すことで、ウェイポイントをフィルタリングすることができます。

class waypointForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ChoiceField(
            choices=[(o.id, str(o)) for o in Waypoint.objects.filter(user=user)]
        )

フォームがユーザーに渡される際に、あなたのビューから

form = waypointForm(user)

モデルフォームの場合

class waypointForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(waypointForm, self).__init__(*args, **kwargs)
        self.fields['waypoints'] = forms.ModelChoiceField(
            queryset=Waypoint.objects.filter(user=user)
        )

    class Meta:
        model = Waypoint