【问题标题】:Django forms processing dynamic field labelsDjango 表单处理动态字段标签
【发布时间】:2014-08-19 19:34:31
【问题描述】:

我制作了一个表单,它可以根据传入的参数和存储在数据库中的权重类动态构建。这一切都很好(注意:它不是 ModelForm,只是一个 Form)。

现在我正在尝试保存用户的回复。如何遍历他们提交的数据以便保存?

这里有一个类似的问题:Processing dynamic MultipleChoiceField in django

但我无法让它为我工作,因为我的情况略有不同。我想查看用户在表单中选择的选项按钮的标签并比较该值,因为它将与已存储在数据库中的权重类的值匹配。该表单包含“first_name”和“last_name”等字段,我用于动态生成权重类的代码如下:

def __init__(self, event, *args, **kwargs):
    super(EntryForm, self).__init__(*args, **kwargs)

    groups = ClassGroup.objects.all()
    weight_classes = ClassOrder.objects.filter(event=event).order_by('weight')
    current_group = regclasses[0].competition_class.class_group

    for weight_class in weight_classes.all():
        self.fields['%s' % weight_class.competition_class.class_group.group_name] = forms.ChoiceField(choices=[ (o.id, o.class_name + ": " + o.class_info) for o in weight_class.competition_class.class_group.classes_in_group.all()], widget=forms.RadioSelect(), label=weight_class.competition_class.class_group.group_name, required=False)

这给了我类似的东西:

男子体重等级

  • 男士轻量级
  • 男子中量级
  • 男子轻量级
  • 男子重量级
  • 男子超重量级

除了不是动态生成的表单字段。

它们都是 RadioSelect 组的一部分。我正在尝试使用以下代码处理表单:

for field in form.fields:
    if Classes.objects.filter(class_name=field).count > 0: #checking to see if the field's name matches a class

    newentry = Entry(
        athlete = athlete,
        event = event,
        athlete_class = Classes.objects.filter(class_name=field)
        )

这个想法是for循环应该迭代表单中的字段并检查字段的标签是否与数据库中的权重类相同。如果数据库中的字段和体重等级匹配,则使用运动员、事件和运动员在表格中选择的体重等级创建一个新条目。当代码运行时,我得到了错误

无法分配“[]”:“Entry.athlete_class”必须是“Classes”实例。

我的猜测是“字段”变量没有引用选项按钮的标签。如何获取表单来处理动态生成的权重类名称?

【问题讨论】:

  • 看起来您的数据库中没有任何 Classes 其中 class_name= 字段。所以你的filter 返回一个空列表,它会爆炸。
  • 是的,有些权重类的 class_name 与字段的标签相匹配。我知道这一点是因为表单上选项按钮的标签是从数据库中的权重类动态生成的。我想知道用户在表单上选择了哪些权重等级,并将其作为外键保存在数据库中的 Entry 模型中。
  • count是一个方法,你需要调用它:if Classes.objects.filter(class_name=field).count():

标签: python django django-forms


【解决方案1】:
Classes.objects.filter(class_name=field)

返回一个查询集,但您需要一个 Classes 实例。

Classes.objects.get(class_name=field)

会这样做的。

【讨论】:

  • 谢谢。这有很大帮助,但现在我得到错误 Classes matching query does not exist。查找参数为 {'class_name': 'first_name'}。我猜它正在查看名为“first_name”的表单中的第一个字段,该字段不是动态生成的(为了便于阅读,省略了该字段)。我认为“if”语句应该过滤掉与数据库中权重类名称不匹配的字段。如何只处理动态生成的字段?
【解决方案2】:

我之前通过创建一个附加到带有动态生成字段的表单的数组来完成此操作,然后对其进行迭代。

或者,您可以将 objects.get(...) 放在 try/except 块中:

try:
    Classes.objects.get(class_name=field)
except:
    pass
else:
    newentry = Entry(
        athlete = athlete,
        event = event,
        athlete_class = Classes.objects.filter(class_name=field)
        )

if 语句不起作用的原因是后面的块没有正确缩进。这也应该有效(注意计数后的括号):

if Classes.objects.get(class_name=field).count() > 0:
    newentry = Entry(
        athlete = athlete,
        event = event,
        athlete_class = Classes.objects.filter(class_name=field)
        )

【讨论】:

  • 嗨,这有帮助吗?如果是,我不介意将此答案标记为正确答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2011-02-07
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多