创建动态选择字段

2024-06-01 10:04:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难理解如何在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()])

但所有这些只是列出所有的路线点,它们与任何特定的骑手都没有关联。有什么想法吗?谢谢。


Tags: django模型selfmodelinitmodelsargs动态
3条回答

您可以通过将用户传递到表单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

问题是当你这样做的时候

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)])

在更新请求中,以前的值将丢失!

你的问题有一个内置的解决方案:ModelChoiceField

通常,当需要创建/更改数据库对象时,尝试使用ModelForm总是值得的。在95%的情况下有效,而且比创建自己的实现更干净。

相关问题 更多 >