我有一个表格,允许用户选择多个货车(多对多关系)。每个货车都有一个名为“ 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的货车。预先感谢。
答案 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)