[前言:虽然我意识到可能有更简单的方法来做到这一点(即,只需使用 Django 内置 Admin,或使用内联在一页上进行所有编辑等),但不幸的是,我无法控制设计,所以我正在寻求有关如何处理我负责实施的工作的帮助。]
我有 2 个模型,甲板和滑动。 Slide 有 Deck 的外键。 (还有一个中间模型——它是一种 m2m 关系——但为了简化已经复杂的讨论,我将假装它是一种更简单的多对一关系。)
我正在实现的界面显示一个页面,其中包含用于输入或编辑 Deck 字段的表单,其中还包括 Deck 中嵌入的幻灯片列表,其中包含一些字段(我正在进行文本输入),还带有一个“每张幻灯片的“编辑”和“删除”锚链接。 (参见图片)如果您单击“编辑”链接,您将进入一个新页面,其中包含详细表格,用于输入代表相应幻灯片内容的所有信息。如果您单击该表单中的“提交”,您将返回到该套牌的页面。
正如标题问题所提出的,我显然不想将任何 Deck 或幻灯片提交到数据库,直到用户单击整个 Deck 的“提交”,即他们可以在此期间添加或编辑许多幻灯片,并可能决定取消整个过程。
最好、最干净的方法是什么?
我查看了 Django 的 FormWizard 类(http://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/ http://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/),但似乎适合多步线性流,而不是我的情况。
我已经必须在演示中实现此功能,并且通过为幻灯片创建内联表单集和为甲板创建表单,然后为隐藏表单和表单集的表单编写子类,我已经完成了大部分工作我在两页之间来回穿梭。下面是一些代码,演示了如何在幻灯片页面中使用隐藏表单:
class DeckForm(ModelForm):
class Meta:
#stuff here
class HiddenDeckForm(DeckForm):
def __init__(self, *args, **kwargs):
super(DeckHiddenForm, self).__init__(*args, **kwargs)
for name, field in self.fields.iteritems():
field.widget = field.hidden_widget()
field.required = False
所以在我看来,每次我进入幻灯片表单页面时,我都会从 POST 数据生成一个 HiddenDeckForm 并将其传入,然后在我看来返回到幻灯片页面时,我会从以下位置重新生成 DeckForm (不是隐藏子类) POST 数据。不会发布我所有的幻灯片表单代码,因为我基本上是在问是否有更好的方法来做到这一点,但类似地,我有一个 HiddenSlideForm 类,并在我的模板之间传递这些表单集以保存状态。
然后当用户在 Deck 页面点击提交时,Deck 表单和 Slides 表单集都会保存到 DB 中。
它确实有效,但是这是一个好方法吗?这是一段很好的代码,我真的不得不深入研究一些 Django 内部结构——感觉就像我正在以一种并非设计用途的方式使用东西。或者是否已经有更标准的方法来处理这种情况?
如果有帮助,我会发布更多代码。
谢谢您的帮助!
PS 如您所见,我在 jquery colorbox 中实现它,并使用 ajax 进行表单之间的转换,但我只是在视图中使用正常的模板/表单渲染,并使用 ajax 将渲染的 html 传递回页面称呼 。 。 。我想我可以用 json 做一些事情,但强烈喜欢坚持传递渲染模板,因为如果需要的话,这样的实现可以在没有 ajax 或 javascript 的情况下使用。