Django formset_factory 对比模型formset_factory 对比内联formset_factory
Django formset_factory vs modelformset_factory vs inlineformset_factory
Django 中的表单可能很复杂。 Formsets 会让你想要退出 Django。我就在那个时候。
有哪些不同的用例以及使用哪一个的注意事项?
我正在寻找关于何时使用每个工厂的更好指导,因为它们似乎取决于您何时知道什么类型的表单、字段,以及您是否正在创建、编辑或删除 (单独的形式完全或父模型完全)。我已经阅读了许多演练,但很难看到更大的图景,尤其是当我试图从基于函数的视图转移到基于 Class 的视图时。
下面是一些带有assumptions/restrictions的伪代码,以帮助您帮助我理解差异。提供伪代码可能会有所帮助,例如什么类型的表单(ModelForm 或常规)与 Formset 一起使用,或者应该从表单中 pop
ped 什么,因为这似乎是创建具有关系的表单的趋势。
假设您有一些模型:
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
? (意思是你将如何处理分配 Meal
它的 Reservation
)
- 假设:
- 在这个阶段你知道它是哪个
Meal
,但你仍然必须在相同的 time/same 视图中制作一个 Reservation
。
- 您不知道要烹饪哪个
Dish
,因为预订会告诉您。
MealPhotos
还不存在,因为饭还没有准备好。
- 您想同时创建餐食和预订form/screen
然后你想加点菜,根据Reservation
说的:
- 你会使用哪个工厂?
- 是否取决于表格是否全部
ModelForms
?
- 假设:
- 在这个阶段你知道它是哪个
Meal
,并且你有一个 Reservation
- 您将根据
Reservation
为餐点分配菜肴,并且您有足够的信息来执行此操作,并且可以轻松使用 ModelForm,但不是必需的
后来吃菜的人要拍几张照片,不知道拍了多少
- 你会使用哪个工厂?
- 是否取决于表格是否全部
ModelForms
?
- 假设:
- 我们会要求他们至少拿两个
- 我们可以访问
Meal
、Reservation
和 Dishes
- 可以选择将照片分配给
Dish
3个formset工厂的区别基本上是:
- formset_factory 让您可以一起呈现一堆表单,但这些表单 NOT 不一定与特定数据库相关模型(这不是你需要的,因为你有所有的模型)
- modelformset_factory 让你 create/edit 一堆 Django 模型对象在一起,例如,如果你正在管理你可以使用的“菜单”一个
modelformset_factory(Dish, fields=('name'))
- inlineformset_factory 允许您管理一堆 Django 模型对象,这些对象都与另一个模型的单个实例相关。例如,如果您想管理在特定餐点拍摄的所有 MealPhotos,这就是您要使用的方法
回答您的具体情况:
如果您想要一个同时创建单一膳食和单一预订的页面,而无需分配任何菜肴,则不需要任何表单集。您可以只使用 ModelForm 进行用餐,使用 ModelForm 进行预订。
稍后,如果您想将多道菜肴附加到餐食中,您可以使用 inlineformset_factory(Meal, Dish)
编辑属于单一餐食的多道菜品
由于我们使用的是 inlineformset_factory
,因此我们必须在呈现表单的视图中创建 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 所有提交的照片都 link 用于那顿饭,但允许将每张照片分配给不同的菜肴(通过表单中的下拉菜单)。
注意:在第一种情况下,我还没有测试你使用 ManyToManyField 作为 Meal.dishes 是否被 formset 工厂支持。如果不是,那么您可以简单地使用 ModelFormset(Dish)
并在创建它们之后,link 它们到处理表单提交的 Django 视图中的 Meal。
Django 中的表单可能很复杂。 Formsets 会让你想要退出 Django。我就在那个时候。
有哪些不同的用例以及使用哪一个的注意事项?
我正在寻找关于何时使用每个工厂的更好指导,因为它们似乎取决于您何时知道什么类型的表单、字段,以及您是否正在创建、编辑或删除 (单独的形式完全或父模型完全)。我已经阅读了许多演练,但很难看到更大的图景,尤其是当我试图从基于函数的视图转移到基于 Class 的视图时。
下面是一些带有assumptions/restrictions的伪代码,以帮助您帮助我理解差异。提供伪代码可能会有所帮助,例如什么类型的表单(ModelForm 或常规)与 Formset 一起使用,或者应该从表单中 pop
ped 什么,因为这似乎是创建具有关系的表单的趋势。
假设您有一些模型:
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
? (意思是你将如何处理分配Meal
它的Reservation
) - 假设:
- 在这个阶段你知道它是哪个
Meal
,但你仍然必须在相同的 time/same 视图中制作一个Reservation
。 - 您不知道要烹饪哪个
Dish
,因为预订会告诉您。 MealPhotos
还不存在,因为饭还没有准备好。- 您想同时创建餐食和预订form/screen
- 在这个阶段你知道它是哪个
然后你想加点菜,根据Reservation
说的:
- 你会使用哪个工厂?
- 是否取决于表格是否全部
ModelForms
? - 假设:
- 在这个阶段你知道它是哪个
Meal
,并且你有一个Reservation
- 您将根据
Reservation
为餐点分配菜肴,并且您有足够的信息来执行此操作,并且可以轻松使用 ModelForm,但不是必需的
- 在这个阶段你知道它是哪个
后来吃菜的人要拍几张照片,不知道拍了多少
- 你会使用哪个工厂?
- 是否取决于表格是否全部
ModelForms
? - 假设:
- 我们会要求他们至少拿两个
- 我们可以访问
Meal
、Reservation
和Dishes
- 可以选择将照片分配给
Dish
3个formset工厂的区别基本上是:
- formset_factory 让您可以一起呈现一堆表单,但这些表单 NOT 不一定与特定数据库相关模型(这不是你需要的,因为你有所有的模型)
- modelformset_factory 让你 create/edit 一堆 Django 模型对象在一起,例如,如果你正在管理你可以使用的“菜单”一个
modelformset_factory(Dish, fields=('name'))
- inlineformset_factory 允许您管理一堆 Django 模型对象,这些对象都与另一个模型的单个实例相关。例如,如果您想管理在特定餐点拍摄的所有 MealPhotos,这就是您要使用的方法
回答您的具体情况:
如果您想要一个同时创建单一膳食和单一预订的页面,而无需分配任何菜肴,则不需要任何表单集。您可以只使用 ModelForm 进行用餐,使用 ModelForm 进行预订。
稍后,如果您想将多道菜肴附加到餐食中,您可以使用 inlineformset_factory(Meal, Dish)
编辑属于单一餐食的多道菜品
由于我们使用的是 inlineformset_factory
,因此我们必须在呈现表单的视图中创建 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 所有提交的照片都 link 用于那顿饭,但允许将每张照片分配给不同的菜肴(通过表单中的下拉菜单)。
注意:在第一种情况下,我还没有测试你使用 ManyToManyField 作为 Meal.dishes 是否被 formset 工厂支持。如果不是,那么您可以简单地使用 ModelFormset(Dish)
并在创建它们之后,link 它们到处理表单提交的 Django 视图中的 Meal。