Python 有条件地从多个模型中创建不同的脆表单集

Python 有条件地从多个模型中创建不同的脆表单集,python,django,django-forms,Python,Django,Django Forms,我想根据某些属性创建不同的表单集。我期望类似的结果: 除了我有多个模型在玩-我的案例是关于显示一个或另一个表单,而不是有条件地显示表单的一部分 型号。py: class Zoo(models.Model): zoo_id = models.AutoField(primary_key=True) zoo_name = models.CharField( max_length=100, verbose_name=Zoo Name') class Animal(mode

我想根据某些属性创建不同的表单集。我期望类似的结果: 除了我有多个模型在玩-我的案例是关于显示一个或另一个表单,而不是有条件地显示表单的一部分

型号。py:

class Zoo(models.Model):
    zoo_id = models.AutoField(primary_key=True)
    zoo_name = models.CharField(
        max_length=100, verbose_name=Zoo Name')
class Animal(models.Model):
    zoo = models.ForeignKey(Zoo, on_delete=CASCADE)
    animal_id = models.AutoField(primary_key=True)
    animal_name = models.CharField(
        max_length=100, verbose_name=Animal Name')
class Dog(models.Model):
    dog_id = models.IntegerField(primary_key=True)
    animal_id = models.ForeignKey(Animal, on_delete=models.CASCADE)
    collar_type = models.CharField(
        max_length=100, null=True, verbose_name='collar_type')
class Cat(models.Model):
    cat_id = models.IntegerField(primary_key=True)
    cat_id = models.ForeignKey(Animal, on_delete=models.CASCADE)
    meow_type = models.CharField(
        max_length=100, null=True, verbose_name='meow_type')
我想要的行为是: 1) 始终显示动物形态。 2) 显示狗或猫的形状-取决于动物园

我通过添加动物,然后添加狗的形式来建立这个项目,并让它大致工作。然而,刚才设置my views.py的方式为Dog表单提供了很多上下文设置—下面是一个示例。我想知道是否有一个好的模式可以遵循,这样我就不会到处都是if-zoo_id=1:DogForm-else:CatForm类型的语句。(另外,当我将来添加更多动物类型时,我需要扩展它)

class EditAnimalView(UpdateView):
    model = Animal
    form_class = AnimalForm
    template_name = edit_animal.html'
    # overrride get_object for use in urls.py
    def get_object(self):
        zoo_id_ = self.kwargs.get("zoo_id")
        animal_id_ = self.kwargs.get("animal_id")
        return get_object_or_404(Animal, animal_id=animal_id_, zoo=zoo_id_)

    def get_context_data(self, **kwargs):
        context = super(EditAnimalView, self).get_context_data(**kwargs)
        zoo_id = self.kwargs.get("zoo_id")
        animal_id = self.kwargs.get("animal_id")
        # If data is posted through the form:
        if self.request.POST:
            context['dog'] = DogFormSet(self.request.POST, instance=self.object)
        else:
            context['dog’] = DogFormSet(instance=self.object)
        return context

    def get_form(self, form_class=None):
        form = super(EditAnimalView, self).get_form(form_class)
        return form

     def form_valid(self, form):
        context = self.get_context_data()
        dog= context[‘dog’]

        dog_id = None

        with transaction.atomic():
            # Get ID of record we are editing / reverting to
            parent_id = form.instance.animal_id
            form.instance.animal_id = None

            if dog.is_valid():
                self.object = form.save()

                dog.instance = self.object
                dog.save()

            else:
                context.update({‘dog’: dog})
                return self.render_to_response(context)
        return super(EditAnimalView, self).form_valid(form)