【问题标题】:Django forms from "Generic related" models来自“通用相关”模型的 Django 表单
【发布时间】:2012-08-26 12:48:44
【问题描述】:

我有一些模型,与GenericForeignKey连接:

Class Main(models.Model)
    filed_1      = models.CharField(max_length=20)
    object_id    = models.PositiveIntegerField()
    content_type = models.ForeignKey(ContentType)
    object       = generic.GenericForeignKey('content_type', 'object_id')

Class Additional_1(models.Model):
    f_1 = models.CharField(max_length=20)
    f_2 = models.CharField(max_length=20)

Class Additional_2(models.Model):
    d_1 = models.CharField(max_length=20)
    d_2 = models.CharField(max_length=20)

此模型的表格:

Class MainForm(forms.ModelForm):
      class Meta:
           model  = Main
           fields = ('filed_1', 'object_id', 'content_type')

           widgets = {
               'object_id': forms.HiddenInput,
               'content_type': forms.HiddenInput
           }

Class Additional_1Form(forms.ModelForm):
    class Meta:
        model  = Additional_1
        fields = ('f1', 'f2')

Class Additional_2Form(forms.ModelForm):
    class Meta:
        model  = Additional_2
        fields = ('d1', 'd2')

如何制作表单,由MainForm + Additional_iForm 的字段组成,一个html表单,一个提交按钮(MainForm + Additional_1FormMain + Additional_2Form)并提供正确的创建和编辑.有办法使用标准的 Django 组件,比如 ForeignKey 的内联表单集?

附:我认为这个问题的答案应该包含在文档的这一部分中,但是信息太少无法回答。 https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations-in-forms-and-admin

第 1 版

# This is always false, because of 'object_id' in main_form
if main_form.is_valid() and additional_1_form.is_valid():
    additional = additional_1_form.save()
    main_form.object_id = additional .id # I need something like this to set object_id 
    main_form.save()

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    创建一个表单标签:

    <form action="..." method="POST">
    {{ main_form }}    
    {{ additional_form_1 }}    
    {{ additional_form_2 }}
    <input type="submit" value="Submit!">
    </form>
    

    其中{{ mainform }}{{ additional_form_1 }}{{ additional_form_2 }} 是 Django 为每个表单生成的 HTML。您可以使用 JavaScript 添加编辑反馈或其他功能(例如在用户为特定字段选择特定值时填写值)。

    在后台,您可以检查每个表单是否有效:

    if (main_form.is_valid() and
       additional_form_1.is_valid() and
       additional_form_2.is_valid()):
       pass
    

    如果没有,您可以再次在表单页面中显示错误。

    【讨论】:

    • 谢谢,但是如何创建/编辑模型?对于创建,我需要先保存附加表单,然后将保存的模型传递给主表单,以通过“通用关系”来绑定模型,对吗?
    • @Deadly:为什么要再次将模型传递给表单?如果您有来自三个表单中的每一个的信息并且它们都是有效的,那么您可以在后端执行正确的保存操作(我目前在 if 语句之后有 pass)。
    • 因为要保存MainForm我需要知道object_id字段,只有在保存附加模型(pk)后才能知道。还有另一个问题:MainForm 总是无效,因为在保存附加模型之前object_id 字段未知,但在MainForm.fields 元组中需要,以使MainForm.save 方法正常工作。我已将视图代码添加到问题中并已编辑类MainForm
    猜你喜欢
    • 1970-01-01
    • 2010-12-01
    • 2021-05-29
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多