#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']