Python 有条件地从多个模型中创建不同的脆表单集
我想根据某些属性创建不同的表单集。我期望类似的结果: 除了我有多个模型在玩-我的案例是关于显示一个或另一个表单,而不是有条件地显示表单的一部分 型号。py: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
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)