如何在表单字段的M2M键中检查特定属性的字段

时间:2019-04-06 17:36:21

标签: python django django-forms

我有一个表格,允许用户选择多个货车(多对多关系)。每个货车都有一个名为“ available”的布尔属性。我只想显示其“可用”属性设置为“真”的货车。如何在forms.py文件中执行此操作?

我知道可以在模板中完成此操作,但是我不想创建一个新的表单模板,但要写出每个字段。我想知道是否可以在forms.py文件或基于类的视图中完成此功能。我相信以这种方式这样做会更清洁一些。我已经研究了验证器,但我不认为这是要走的路。也许我需要在表单文件中运行查询集以检查属性,然后再将其传递给表单模板?

views.py

def post(self, request):
        """Take in user data, clean it, and then post it to the database."""
        form = self.form_class(request.POST) # pass in the user's data to that was submitted in form 

        if form.is_valid():
            trip = form.save(commit=False) # create an object so we can clean the data before saving it

            # now get the clean and normalize the data
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            trip_start = form.cleaned_data['trip_start']
            trip_end = form.cleaned_data['trip_end']
            van_used = form.cleaned_data['van_used']
            trip.save()

forms.py

class TripForm(forms.ModelForm):
    """This class will be used to build trips."""

    class Meta:
        """Specifying the database and fields to use."""

        model = trips
        fields = ['first_name', 'last_name', 'comments','trip_start', 'trip_end', 'van_used']

models.py

class trips(models.Model):
    class Meta:
        verbose_name_plural = "trips"

    van_used = models.ManyToManyField(vans)

class vans(models.Model):
    class Meta:
        verbose_name_plural = "vans"

    vanName = models.CharField(max_length=30, unique=True, blank=False)
    available = models.BooleanField(default=True, blank=False)

    # set up how the vans will be referenced in the admin page
    def __str__(self):
        return self.vanName

呈现的最终形式将仅显示其“ available”属性设置为True的货车。预先感谢。

1 个答案:

答案 0 :(得分:1)

您必须以这种形式覆盖van_used字段的查询集。

class TripForm(forms.ModelForm):
    """This class will be used to build trips."""

    class Meta:
        """Specifying the database and fields to use."""

        model = trips
        fields = ['first_name', 'last_name', 'comments','trip_start', 'trip_end', 'van_used']

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['van_used'].queryset = vans.objects.filter(available=True)