【问题标题】:set variable into queryset of forms.py from my generic view or url从我的通用视图或 url 将变量设置为 forms.py 的查询集
【发布时间】:2017-10-06 09:26:47
【问题描述】:

我想在forms.pyqueryset中设置一个动态变量,我用__init__传递动态变量,我认为forms.py中的代码是正确的,问题是如何传递变量观看次数?

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'

错误说:

Exception Value:'ContainerForm' object is not callable

【问题讨论】:

  • 错误是因为form_class必须是表单类,但是你正在实例化一个实例。您没有包含足够的代码来提供进一步的帮助。 vehicle_id 来自哪里?表单如何使用id
  • 是的,你是对的,vehicle_id 来自我的模型 Vehicle
  • 这没有意义。在您的问题中,您使用的是vehicle_id,但您尚未在任何地方定义它。价值均值从何而来?网址?如果是这样,请显示 url 模式。您还没有展示模型表单如何使用id
  • 这是我的网址:127.0.0.1:8000/vehicule_app/1/containeradd,数字 1 是车辆 ID,我不知道如何将其设置到我的视图中
  • 您还没有显示 URL 模式

标签: django django-forms django-views


【解决方案1】:

如果您想使用 URL 中的vehicle_id,则可以从模型表单中排除该字段:

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

然后您可以从self.kwargs 获取参数,并在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

请注意,上面的代码不会验证来自 URL 的 id。用户可以将其更改为他们喜欢的任何值。

如果您想在表单中保留vehicle 字段但只有一个选择,请覆盖__init__ 方法并设置查询集。

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)

然后在 get_form_kwargs 方法中,将 vehicle_id 添加到 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()
        kwargs['vehicle_id'] = self.kwargs['pk']
        return kwargs

【讨论】:

  • 谢谢,我的理解是我会将这段代码添加到我的通用视图中,但是 forms.py 呢,我必须改变一些东西?
  • 你能看看我的帖子吗,我更新了它以显示所有的forms.py
猜你喜欢
  • 2016-05-09
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
相关资源
最近更新 更多