Есть ли способ отфильтровать форму модели на основе логического значения соответствующей модели?

#django-models #django-forms

Вопрос:

у меня есть три модели в моем проекте Django. Donor , Patient и Donation это веб-приложение для донорства крови, которое я пытаюсь создать.

Вот Donation модель:

 class Donation(models.Model):  donor = models.ForeignKey(Donor, on_delete=models.CASCADE)  patient = models.ForeignKey(Patient, on_delete=models.CASCADE)  donation_date = models.DateTimeField(auto_now=True)  amount = models.DecimalField(max_digits=5, decimal_places=2)    class Meta:  ordering = ['-donation_date']  

Вот Patient модель:

 class Patient(models.Model):  BLOOD_GROUPS = [  ('O ', 'O '),  ('O-', 'O-'),  ('A ', 'A '),  ('A-', 'A-'),  ('B ', 'B '),  ('B-', 'B-'),  ('AB ', 'AB '),  ('AB-', 'AB-'),  ]  first_name = models.CharField(max_length=100)  last_name = models.CharField(max_length=30)  id_card = models.CharField(max_length=7)  phone_number = models.CharField(max_length=7)  blood_group = models.CharField(  max_length=20, choices=BLOOD_GROUPS, default='O ')   def __str__(self):  return f'{self.first_name} {self.last_name}'   class Meta:  ordering = ['first_name']  

Вот Donor модель:

 class Donor(models.Model):  BLOOD_GROUPS = [  ('O ', 'O '),  ('O-', 'O-'),  ('A ', 'A '),  ('A-', 'A-'),  ('B ', 'B '),  ('B-', 'B-'),  ('AB ', 'AB '),  ('AB-', 'AB-'),  ]  first_name = models.CharField(max_length=30)  last_name = models.CharField(max_length=30)  id_card = models.CharField(max_length=7)  phone_number = models.CharField(max_length=7)  blood_group = models.CharField(  max_length=20, choices=BLOOD_GROUPS, default='O_Positive')  availability = models.BooleanField(default=True)   def __str__(self):  return f"{self.last_name} - ({self.id_card})"  

Итак, как вы можете видеть, в модели есть логическое поле Donor . Каждый раз, когда донор сдает кровь, доступность становится ложной. Затем, когда я хочу, чтобы при отображении формы пожертвования при вводе новой записи о пожертвовании отображались только доноры с истинным состоянием доступности. смотрите демонстрацию этой формы пожертвования Предположим, скажем, Маклин из этого пожертвовал, и его доступность становится ложной. В следующий раз при вводе нового пожертвования Он не должен появляться. Это то, чего я хочу достичь. Кто-нибудь может помочь?

Вот вид для добавления нового пожертвования.

 def new_donation(request): if request.method == 'POST':  form = DonationForm(request.POST or None)  print(request.POST['donor'])  if form.is_valid():  donor = Donor.objects.get(id=request.POST['donor'])  print(donor)  donor.availability = False  donor.save()  form.save()  return render(request, 'new_donation.html', {'form': form}) form = DonationForm() return render(request, 'new_donation.html', {'form': form})  

вот форма пожертвования:

 class DonationForm(forms.ModelForm):  class Meta:  model = Donation  fields = ['donor', 'patient', 'amount']  

Ответ №1:

Добавьте отфильтрованный набор запросов для поля формы донора

 class DonationForm(forms.ModelForm):  donor = forms.ModelChoiceField(queryset= Donor.objects.filter(availability=True)  class Meta:  model = Donation  fields = ['donor', 'patient', 'amount']