【问题标题】:Django - Dynamic form fields based on foreign keyDjango - 基于外键的动态表单字段
【发布时间】:2017-02-22 16:40:16
【问题描述】:

我正在创建一个包含程序的数据库,而这些程序存在风险。一些背景信息: 程序(祖父母)具有多个特征(父母),其具有多个类别(孩子)。我已经构建了一个包含这些的数据库,但是,我想为特定程序添加风险。

也就是说,例如我有风险 1,我想将其添加到计划 1。我必须回答以下问题:风险 1 具有哪些特征?为了回答这个问题,我想构建一个动态表单域。 (注意,特征的数量可以是任意数量,以及每个特征所具有的类别数量)。

我如何构建这样的表格?我已经尝试过表单集,但是我不知道如何以实际的方式实现它们(我对 Python 还是有点陌生​​)。

这是我希望如何实现它的打印屏幕:https://gyazo.com/40c448c0096a9ec5da751ba9883dc912
但是,我不知道该怎么做。 (请注意,下拉菜单中的可能答案是与该特定特征相对应的类别)。 这就是我得到的:https://gyazo.com/25fd18e2f31e6931bfd3639ce4be632c

这是我到目前为止的相应代码:

# views.py 
def risk_create(request):
program = get_object_or_404(Program, id=20)
RiskFormSet = formset_factory(RiskForm, ...
    ... extra=len(Program.objects.get(id=program.id).char_set.all()))
context = {
    'title': 'New Risk',
    'form': RiskFormSet
}
return render(request, 'risk_form.html', context)


# forms.py
class RiskForm(forms.Form):
for char in Program.objects.get(id=20).char_set.all():
    char = forms.ModelChoiceField(char.cat_set.all(), label=char)

我找到了答案。

class RiskForm(forms.Form):
def __init__(self, *args, **kwargs):
    programid = kwargs.pop('programid', None)
    super(RiskForm, self).__init__(*args, **kwargs)
    for i in range(0,len(Program.objects.get(id=programid).char_set.all())):
        charid = Program.objects.get(id=programid).char_set.all()[i].id
        charlabel = Program.objects.get(id=programid).char_set.all()[i].label
        self.fields['char_field_%i' %i] = forms.ModelChoiceField(Char.objects.get(id=charid).cat_set.all(), label=charlabel)

【问题讨论】:

  • 编辑:假设我有一个字符查询集 (Char.objects.filter(program__id=char.program_id)。我想根据这个查询集制作一个表单。也就是说,这个查询集有4 个特征。我的表单需要有 4 个字段,要求每个特征的类别

标签: python django forms dynamic formset


【解决方案1】:

重新表述您的问题,您是在问如何预填充表单字段吗?如果是这样考虑使用initial values in your formsets

【讨论】:

  • 不,很抱歉,由于在第二个打印屏幕中,初始值设置为--------,造成误解。在第一个打印屏幕中,我已经手动将它们设置为一个值。问题是,如何在最后一行代码中动态定义“char”(因此变量获取 char 标签)。这是不可行的,但是,我想知道一个解决方法
猜你喜欢
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2012-10-19
  • 1970-01-01
  • 2023-03-26
  • 2010-10-11
相关资源
最近更新 更多