I'm trying to populate a 'vaccine' dropdown based on a 'species' of a pet. For example, if a pet is a 'dog' I want to display vaccines for a dog only. If a pet is a cat, I want to display a list of vaccines for cats only.
How do I do this? I googled, but didn't come up with anything solid.
class Pet(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=100, null=True, db_index=True)
species = models.CharField(choices=SPECIES_CHOICES, null=True, max_length=20)
def __str__(self):
return self.name
class Vaccine(models.Model):
vacc_name = models.CharField(max_length=100)
species = models.CharField(choices=SPECIES_CHOICES, null=True, max_length=20)
pet = models.ManyToManyField(Pet, through='PetHasVaccine')
def __str__(self):
return self.vacc_name
class PetHasVaccine(models.Model):
pet = models.ForeignKey(Pet, on_delete=models.DO_NOTHING)
vaccine = models.ForeignKey(Vaccine, on_delete=models.DO_NOTHING)
def __str__(self):
return str(self.pet.name) + ' - ' + str(self.vaccine.vacc_name)
Here is my views.py
def add_vaccine(request, pet_pk):
pet = Pet.objects.get(pk=pet_pk)
if pet.user == request.user:
form = VaccineForm(request.POST or None)
if request.POST:
if form.is_valid():
return HttpResponse(form)
else:
return render(request, 'pet/vaccine_add.html', {'vacc_form': VaccineForm(request.POST), 'pet': pet})
else:
return render(request, 'pet/vaccine_add.html', {'vacc_form': form, 'pet': pet})
Here is my forms.py
class VaccineForm(ModelForm):
class Meta:
model = PetHasVaccine
fields = '__all__'
exclude = ('pet',)
widgets = {
'date_given': DateInput(),
'date_due': DateInput(),
}