set variable into queryset of forms.py from my generic view or url

大城市里の小女人 提交于 2019-12-12 04:36:51

问题


I want to set a dynamic variable into queryset of forms.py , I used __init__ to pass the dynamic variable , I think the code in forms.py is correct, the problem is how to pass the variable in views?

forms.py :

class ContainerForm(forms.ModelForm):
    vehicle=forms.ModelChoiceField(required=False,queryset=Vehicle.objects.all(),widget=forms.Select(attrs={'class':'form-control'}))

  def __init__(self, *args, **kwargs):
      vehicle_id = kwargs.pop('vehicle_id',None)
      super(ContainerForm, self).__init__(*args, **kwargs)
      if vehicle_id:
          self.fields['vehicle'].queryset = Vehicle.objects.filter(id=vehicle_id)

views.py

class ContainerCreate(CreateView):
    form_class = ContainerForm(id= vehicle_id)
    template_name = 'vehicule_app/container_form.html'

the error said :

Exception Value:'ContainerForm' object is not callable

回答1:


If you want to use the vehicle_id from the URL, then you can exclude the field from the model form:

class ContainerForm(forms.ModelForm):
    class Meta:
        model = Container
        exclude = ['vehicle'] 

You can then fetch the parameter from self.kwargs, and set the value on the form's instance in get_form_kwargs:

class ContainerCreate(CreateView):
    form_class = ContainerForm
    template_name = 'vehicule_app/container_form.html'

    def get_form_kwargs(self):
        kwargs = super(ContainerCreate, self).get_form_kwargs()
        if kwargs['instance'] is None:
            kwargs['instance'] = Container()
            kwargs['instance'].vehicle_id = self.kwargs['pk']  # Fetch the vehicle_id from the URL
        return kwargs

Note that the above code will not validate the id from the URL. The user could change it to any value they like.

If you want to keep the vehicle field in the form but with a single choice, then override the __init__ method and set the queryset.

class ContainerForm(forms.ModelForm):
    class Meta:
        model = Container

    def __init__(self, *args, **kwargs):
        vehicle_id = kwargs.pop('vehicle_id')
        self.fields['vehicle'].queryset = Vehicle.objects.filter(id=vehicle_id)

Then in the get_form_kwargs method, add vehicle_id to kwargs instead:

class ContainerCreate(CreateView):
    form_class = ContainerForm
    template_name = 'vehicule_app/container_form.html'

    def get_form_kwargs(self):
        kwargs = super(ContainerCreate, self).get_form_kwargs()
        kwargs['vehicle_id'] = self.kwargs['pk']
        return kwargs


来源:https://stackoverflow.com/questions/43846588/set-variable-into-queryset-of-forms-py-from-my-generic-view-or-url

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!