将ModelForm字段添加为对象的属性

时间:2016-10-25 11:39:48

标签: django forms attributes add modelform

我将我的风险模型设置为:

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

但是,我想在Risk对象下将我创建的额外字段存储到我的数据库中。 就像我现在一样,它只存储两个属性'program'和'label'。但是,我还想将特征的答案存储到我的数据库中以供以后使用。

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

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

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

1 个答案:

答案 0 :(得分:0)

Django中的表单是用户界面对象:它为用户提供了一组字段来键入答案,检查他们提供的数据是否有效,并将其从文本转换为所需的Python数据类型(int,date等)。它不必与任何特定模型相关,并且通常不会。例如,在线商店可能具有购买选择表格,其将关于可能订单的数据添加到用户的会话中,而不是立即对产品或库存对象执行任何类型的更新。这会在结账时发生。

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

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

在这种情况下,我不清楚你想如何存储所有六个答案。如果有一组预定的相当小的答案,你可以拥有一个有六个的单个对象吗?十?可以为空的可能字段集,表示该对象没有该实体。或者,可能更好,您可以创建一组Answer对象,每个对象与Risk对象具有外键关系,稍后引用Risk.answer_set(与您的风险对象具有外键关系的所有Answer对象)。这是开放式的,Risk对象可以包含从零到bignum相关答案的任何内容。