创build一个dynamicselect字段
我在尝试了解如何在django中创builddynamicselect字段时遇到了一些麻烦。 我有一个模型设置类似于:
class rider(models.Model): user = models.ForeignKey(User) waypoint = models.ManyToManyField(Waypoint) class Waypoint(models.Model): lat = models.FloatField() lng = models.FloatField()
我想要做的是创build一个select字段whos值是与骑手(这将是login的人)相关的航点。
目前我在我的forms覆盖初始化像这样:
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)] )
在发起表单的同时从您的视angular传递用户
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
有问题的内置解决scheme: ModelChoiceField 。
通常,当您需要创build/更改数据库对象时,总是值得使用ModelForm
。 在95%的情况下工作,它比创build自己的实施更清洁。
问题是当你这样做
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)])
在更新请求中,以前的值将会丢失!
如何在初始化时将骑手实例传递给窗体?
class WaypointForm(forms.Form): def __init__(self, rider, *args, **kwargs): super(joinTripForm, self).__init__(*args, **kwargs) qs = rider.Waypoint_set.all() self.fields['waypoints'] = forms.ChoiceField(choices=[(o.id, str(o)) for o in qs]) # In view: rider = request.user form = WaypointForm(rider)
正如Breedly和Liang所指出的,Ashok的解决scheme将阻止您在发布表单时获得select的价值。
一个稍微不同的,但仍然不完美的方法来解决这个问题将是:
class waypointForm(forms.Form): def __init__(self, user, *args, **kwargs): self.base_fields['waypoints'].choices = self._do_the_choicy_thing() super(waypointForm, self).__init__(*args, **kwargs)
但这可能会导致一些并发问题。
在正常的select领域下的工作解决scheme。 我的问题是,每个用户都有自己的CUSTOM choicefield选项基于less数条件。
class SupportForm(BaseForm): affiliated = ChoiceField(required=False, label='Fieldname', choices=[], widget=Select(attrs={'onchange': 'sysAdminCheck();'})) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request', None) grid_id = get_user_from_request(self.request) for l in get_all_choices().filter(user=user_id): admin = 'y' if l in self.core else 'n' choice = (('%s_%s' % (l.name, admin)), ('%s' % l.name)) self.affiliated_choices.append(choice) super(SupportForm, self).__init__(*args, **kwargs) self.fields['affiliated'].choices = self.affiliated_choice