【问题标题】:Add ModelForm Fields as Attribute to Object将 ModelForm 字段作为属性添加到对象
【发布时间】:2017-03-07 10:41:12
【问题描述】:

我的风险模型表单设置为:

class RiskForm(forms.ModelForm):
    class Meta:
        model = Risk
        fields = '__all__'
    def __init__(self, *args, **kwargs):
        progid = kwargs.pop('progid')
        super(RiskForm, self).__init__(*args,**kwargs)
        dict_of_fields = {}
        all_char = Program.objects.get(id=progid).char_set.all()
        for char in all_char:
            c = []
            for cat in char.cat_set.all():
                c.append( (cat.label, cat.label) )
            dict_of_fields[char.label] = c
            self.fields[char.label] = forms.ChoiceField(c)

风险对象定义为:

class Risk(models.Model):
    program = models.ForeignKey(Program, on_delete=models.CASCADE)
    label = models.CharField(max_length=200, default='')

    def __str__(self):
        return self.label

但是,我想将我创建的额外字段存储到我的风险对象下的数据库中。 正如我现在所拥有的,它只存储两个属性“程序”和“标签”。但是,我还想将特征的答案存储到我的数据库中以供以后使用。

有关我如何设置的更多信息:Django Form Based on Variable Attributes

还有我的 ModelForm 的打印屏幕:https://gyazo.com/89c9833613dbcc7e8d27cc23a3abaf72

是否可以将所有 6 个答案存储在我的数据库中的风险对象下?如果是这样,我该怎么做?

【问题讨论】:

  • 您可以创建 Answer 模型并与您的 Risk 模型建立多对多关系。
  • 您能详细说明一下吗?我还在学习 Python,我的主管说我应该避免多对多的关系。如果没有其他方法,我认为除了使用它们之外别无他法。但是,我不知道如何构建它。你能帮我/给我一些关于如何写这个的通用(大纲)代码吗?
  • 我建议你问问你的主管为什么要避免多对多的关系!!但是,我遵循的总体思路来决定这种关系将是 ForeighKey、OneToOneField 或 ManyToManyField:如果您可以说“一个风险可以有多个答案,一个答案可以有多个风险”然后使用 ManyToManyField。如果您可以说“一个风险可以有多个答案,一个答案可以在一个风险中”,然后使用外键。我想知道您的回答与风险或计划有何关联?
  • 每个风险都有多个特征(因此有答案),每个答案可能有多个风险(例如:风险 1:{占用:农场,建筑:木框架} 风险 2:{占用:农场,结构:金属框架})。我可以看到有多少多对多字段派上用场。但是,我如何在没有 shell 命令的情况下初始化它(我可以在 shell 中做几乎所有事情,但是,在模型/表单中编程对我来说仍然相当困难)
  • 我不确定你是否读过这篇文章:docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many 它通过示例展示了如何创建多对多对象并保存它们。

标签: django forms attributes add modelform


【解决方案1】:

Django 中的表单是一个用户界面对象:它为用户提供一组字段以输入答案,检查他们提供的数据是否有效,并将其从文本转换为所需的 Python 数据类型(int、date 等)。它不必与任何特定模型相关,而且通常也不需要。例如,在线商店可能有购买选择表单,将有关可能订单的数据添加到用户会话中,而不是立即对 Product 或 Stock 对象执行任何类型的更新。稍后会在结帐时发生这种情况。

ModelForm 假定存在 Model 与 Form 的关系。当用户的答案与单个模型实例之间存在简单关系时,这通常是正确的方法。

如果您遇到这样一种情况,即用户的回答指导创建多个与任何特定对象的关系不太直接的数据库对象,您可能不需要 ModelForm,只需要一个 Form。也可能不是基于模型的视图,而是基于函数的视图。然后,您可以在从 URL 解析器获取参数的视图和向用户显示表单之间执行任何您需要的操作。同样,视图确定用户的 POST 数据有效和告诉用户他提交的请求是否成功(以及为什么)之间的任何内容。

在这种情况下,我不清楚您希望如何存储所有六个答案。如果有一个预先确定的相当小的答案集,你可以有一个包含六个的对象?十?可能的字段集可以为空,以指示该对象没有该实体。或者,可能更好的是,您可以创建一组 Answer 对象,其中每个对象都与 Risk 对象具有外键关系,然后参考 Risk.answer_set(与您的风险对象具有外键关系的所有 Answer 对象)。这是开放式的,Risk 对象可以有从零到 bignum 相关的任何答案。

【讨论】:

  • 根据您的前三段,我可能需要使用基于表单和函数的视图。谢谢你,今天晚些时候会调查。考虑你的第四段。我的项目中没有预先确定的任何东西,这也是“问题”。可以任意创建具有“无限”数量的字符的程序,并且每个字符都有“无限”数量的可能类别可供选择。因此,我必须使用父 ID 来获得正确的 ID,我无法做出预先确定的答案集。
  • 基于您需要程序、字符和类别模型。每个类别都有一个字符的外键(因此一个字符有一组类别),每个字符都有一个程序的外键。用户选择一个程序。然后,您可以根据程序的 Character_set 答案动态构建一个带有问题的表单,该表单可以根据每个角色的 category_set 进行选择(如果我理解你的话……)返回的答案可能会存储在一堆可能有外来的 Answer 对象中提交它们的人和与之相关的角色的密钥。
  • 抱歉回复晚了,暂时离开了。是的,我有。直到动态构造的表单。我试图回答这个问题的是我如何将这些答案存储到一个 Answer 对象中。此外,一个表单的所有答案都需要具有相同的父级而不需要其他父级(因此不是提交的人,而是与这些答案相对应的风险)。将更深入地研究 Answer 对象而不是 Risk 对象的方式(或者也许 Answer with ForeignKey Risk)。还是非常感谢!
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2013-10-08
  • 2018-05-10
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多