【发布时间】: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