Django 将自定义表单字段保存到数据库的有效方法
我很难将许多字段保存到数据库中。我有许多“结果值”字段,它们是根据我的结果数量生成的。用户选择结果的子集(RelevantOutlets)并输入相关值。我想保存与结果相关的值。到目前为止,我只能硬连接字段名,这并不能解决问题 views.pyDjango 将自定义表单字段保存到数据库的有效方法,django,django-forms,Django,Django Forms,我很难将许多字段保存到数据库中。我有许多“结果值”字段,它们是根据我的结果数量生成的。用户选择结果的子集(RelevantOutlets)并输入相关值。我想保存与结果相关的值。到目前为止,我只能硬连接字段名,这并不能解决问题 views.py stateoption = get_object_or_404(StateOption, pk=stateoption_id) if request.method == "POST": form = UpdateStateOptionWithOu
stateoption = get_object_or_404(StateOption, pk=stateoption_id)
if request.method == "POST":
form = UpdateStateOptionWithOutcomesForm(request.POST, instance=stateoption)
if form.is_valid():
cd = form.cleaned_data
outcomevalue = cd['outcomevalue_1'] #hardwired. This needs to be generalized.
for outcome_id in request.POST.getlist('relevantoutcome'):
stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue)
forms.py
class UpdateStateOptionWithOutcomesForm(forms.ModelForm):
class Meta:
model = StateOption
def __init__(self, *args, **kwargs):
super(UpdateStateOptionWithOutcomesForm, self).__init__(*args, **kwargs)
self.fields['relevantoutcome']=forms.ModelMultipleChoiceField(queryset=Outcome.objects.all(),required=True, widget=forms.CheckboxSelectMultiple)
outcome_qs=Outcome.objects.all()
for outcome in outcome_qs:
self.fields['outcomevalue_%s' % outcome.pk] = forms.CharField(required=False)
更新
这是我的脱衣模特
class StateOptionOutcome(models.Model):
stateoption = models.ForeignKey(StateOption)
relevantoutcome = models.ForeignKey(Outcome)
outcomevalue = models.CharField(max_length=20)
在玩了一些游戏之后,我有了一些类似的东西:
outcomelist = request.POST.getlist('relevantoutcome')
for outcome_id in outcomelist:
cd = form.cleaned_data
outcomevalue = cd['outcomevalue_%s' % outcomelist[int(outcome_id)]]
stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue)
但是得到错误:
list index out of range
因为它获取的是列表中的值而不是索引位置如果我理解正确,那么您尝试使用一对一的关系,其中应该有一对多。如果一个StateOption有多个结果,我建议您使用多对多桥接表来连接哪个StateOption有哪些结果。然后,在该桥接表中,您还可以将关联的值存储为相应状态选项/结果对的附加列。使用以下方法解决该问题:
outcomelist = request.POST.getlist('relevantoutcome')
for i,outcome_id in enumerate(outcomelist):
cd = form.cleaned_data
outcomevalue = cd['outcomevalue_%s' % outcomelist[i]]
stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue)
我有那张桥牌桌。我会把它贴在上面。我在保存结果的所有结果值时遇到了问题。代码会解决它,但不会保存所有结果的所有值。供参考: