Django形成处理动态字段标签

时间:2014-06-29 03:58:14

标签: python django django-forms

我创建了一个根据传入的参数动态构建的表单,以及存储在数据库中的权重类。这一切都很好(注意:它不是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)

这给了我类似的东西:

男子体重等级

  • 男子轻量级
  • 男子中量级
  • 男子Lightheavyweight
  • 男子Hevyweight
  • 男子超重量级

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

这些都是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"必须是一个"课程"实例

我的猜测是'字段'变量不引用选项按钮的标签。如何让表单处理动态生成的权重类的名称?

2 个答案:

答案 0 :(得分:1)

Classes.objects.filter(class_name=field)

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

Classes.objects.get(class_name=field)

会这样做。

答案 1 :(得分:0)

我之前已经通过使用动态生成的字段创建附加到表单的数组然后迭代它来完成此操作。

或者你可以将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)
        )