在Django中,表单可能很复杂。表单集可以使您想退出Django。我在那个时候。

有哪些不同的用例,以及要使用哪些用例的注意事项?

我正在寻找有关何时使用每个工厂的更好的指导,因为它们似乎取决于您何时知道哪种类型的表单,字段以及是否要创建,编辑或删除(单个表单完全还是单个表单)。父模型)。我已经阅读了许多演练,但是正在努力查看大图,尤其是当我尝试从基于函数的 View 转换为基于类的 View 时。

以下是一些带有假设/限制的伪代码,可帮助您帮助我理解不同之处。提供伪代码可能会有所帮助,例如哪种类型的表单(ModelForm或常规)与Formset一起使用,或者应该从表单中提取pop,因为这似乎是创建具有关系的表单的趋势。

假设您有一些模型:

class Dish(models.Model):
    name = models.CharField(max_length=50)


class Meal(models.Model):
    name = models.CharField(max_length=50)
    dishes = models.ManyToManyField(Dish,
                                    # through='OPTIIONALMealDishIntermediaryClassTable',
                                    related_name="meal")

class Reservation(models.Model):
    date = models.DateTimeField()
    greeting = models.CharField(max_length=255)
    meal = models.OneToOneField(Meal, on_delete=models.CASCADE)


class MealPhotos(models.Model):
    photo = models.OneToOneField(Photo, on_delete=models.CASCADE, related_name='mealPhoto')
    meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
    # optional, so a photo can be attached to a dish if the picture is just of the dish
    dish = models.ForeignKey(Dish, blank=True, null=True, on_delete=models.CASCADE)

您想创建一个新的Meal,同时要发送一个Reservation:
  • 您将使用哪个工厂?
  • 是否取决于表单是否都是ModelForms? (表示您将如何处理MealReservation的分配)
  • 假设:

    在这个阶段
  • 您知道它是哪个Meal,但是您仍然必须在同一时间/相同 View 中制作一个Reservation
  • 您不知道要 cooking 哪种Dish,因为预订会告诉您。
  • 由于尚未准备餐点,因此
  • MealPhotos尚不存在。
  • 您要在同一表格/屏幕上创建餐点和预订

  • 然后,您要根据Reservation的说明添加一些菜肴:
  • 您将使用哪个工厂?
  • 是否取决于表单是否都是ModelForms
  • 假设:
  • 在此阶段,您知道它是哪个Meal,并且您有一个Reservation
  • 您将基于Reservation将餐点分配给餐点,您将有足够的信息来这样做,并且可以轻松地使用ModelForm,但不是必需的

  • 后来,吃菜的人想拍照,而你不知道要拍几张。
  • 您将使用哪个工厂?
  • 是否取决于表单是否都是ModelForms
  • 假设:
  • 我们将要求他们至少接受两个
  • 我们可以访问MealReservationDishes
  • 可以选择将照片分配给Dish
  • 最佳答案

    这三个模板工厂之间的区别基本上是:

  • formset_factory 允许您一起渲染一堆表单,但是这些表单是而不是与任何数据库模型相关(这不是您所需要的,因为您拥有所有模型)
  • modelformset_factory 允许您一起创建/编辑一堆Django模型对象,例如,如果要管理“菜单”,则可以使用modelformset_factory(Dish, fields=('name'))
  • inlineformset_factory 允许您管理一堆与另一个模型的单个实例相关的Django模型对象。例如,如果您要管理在特定餐点上拍摄的所有MealPhoto,则可以使用

  • 要回答您的特定方案:

    如果您想要一个页面同时创建一个膳食和一个预订,而又没有分配任何菜品,则不需要任何表单集。您可以仅将ModelForm用于用餐,将ModelForm用于预订。

    稍后,如果要将多个菜品附加到餐中,则可以使用inlineformset_factory(Meal, Dish)编辑属于一个餐中的多个菜品

    由于我们使用的是inlineformset_factory,因此我们必须在呈现表单的 View 中创建Meal实例。像这样:
    DishFormSet = inlineformset_factory(Meal, Dish)
    bday_dinner = Meal.objects.create(name='30th Birthday dinner')
    formset = DishFormSet(instance=bday_dinner)
    

    对于上传餐点照片的人,您可以使用:
    PhotosFormSet = inlineformset_factory(Meal, MealPhotos)
    bday_dinner = Meal.objects.get(name='30th Birthday dinner')
    formset = PhotosFormSet(instance=bday_dinner)
    

    这告诉Django,所有提交的照片都链接到该餐,但允许将每张照片分配给不同的菜(通过表格中的下拉菜单)。

    注意:在第一种情况下,我尚未测试formset工厂是否支持使用ManyToManyField作为Meal.dishes。如果不是,那么您可以简单地使用ModelFormset(Dish),并在创建后将它们链接到Django View 中的Meal,以处理表单提交。

    关于django - Django formset_factory与modelformset_factory与inlineformset_factory,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53035151/

    10-11 06:42