2015-11-19 49 views
1

我仍在学习Django。我有一个像表单工作流程那样的向导,每个表单都连续填写信息。Django表格不适用于模型表格

我代表我想从表单输入的模型形式:

Models.py

class AccountParameters(models.Model): 
    acctFilterName = models.ForeignKey(AccountFilters) 
    excludeClassification = models.ManyToManyField(ClassificationNames) 
    tradingCash = models.FloatField() 

Forms.py

这是一种简单化的形式并不代表真正的实施。它用于测试。

class AccountSelectionForm(forms.ModelForm): 

acctFilterName = forms.ModelChoiceField(queryset=AccountFilters.objects.all().values_list('acctFilterName', flat=True), 
              label="Account Filters:", 
              empty_label="Select Here..." 
              ) 

excludeClassification = forms.ModelMultipleChoiceField(queryset=ClassificationNames.objects.all().values_list('classificationName', flat=True), 
               label="Classifications Exclusion:" 
              ) 

tradingCash = forms.IntegerField(label="Remove accounts whose trading cash < % of AUM") 


class Meta: 
    model = AccountParameters 
    fields =['excludeClassification', 'tradingCash',] 
    exclude = ['acctFilterName'] 
    labels = { 
     'acctFilterName': _('Account Filters:') 
    } 

views.py

def accountSelections(request): # NewRebalnce 2: AccountParameters with Accounts and Trading Form 

if request.method == "POST": 
    form = AccountSelectionForm(request.POST) 

    if form.is_valid(): 

     accountParameters = AccountParameters 


    #tradingCash = form.cleaned_data['tradingCash'] 

    return render(request, 'NewRebalance_3.html', {'model_selection_form': ModelSelectionForm()}) 
else: 
    form = AccountSelectionForm() 
return render(request, 'NewRebalance2.html', {'account_selections_form': form}) 

我不知道,我在正确使用Modelforms。我需要的是一种为我的acctFilterName创建选择下拉列表的方式,所以我手动创建了查询集。

当我保存表单时,表单无效,并在表单清理数据中获得以下内容: 请注意,已清理的数据仅包含tradingCash字段。

我在做什么错?有一个更好的方法吗?为什么表格有效?

Screenshot of Debug

+0

您在views.py中保存表单的位置? –

+0

我不这样做,因为form.is_valid()是假的 – Axwack

回答

-1

你为什么要重新声明你的AccountSelectionForm的ModelForm领域???

这样更好:

class AccountSelectionForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     self.fields['excludeClassification'].queryset = ClassificationNames.objects.all().values_list('classificationName', flat=True) 
     self.fields['acctFilterName'].queryset = AccountFilters.objects.all().values_list('acctFilterName', flat=True) 

    class Meta: 
     model = AccountParameters 
     fields =['excludeClassification', 'tradingCash',] 
     exclude = ['acctFilterName'] 
     labels = { 
      'acctFilterName': _('Account Filters:') 
     } 
+0

欢迎来到堆栈溢出。这应该是一个评论,不应该作为答案出现,请将您的问题发表评论部分。 –

+0

对不起,我还没有评论:(,没有足够的声望 –

+0

因此,这是我对这种工作方式的知识缺乏。AcctFilter是一个查询。我想这个查询后台作为模型选项字段,但不能做所以请注意,在查询集中,我明确填充了小部件的值。 – Axwack

1

尝试从ModelChoiceField删除.values_list('acctFilterName', flat=True),并从ModelMultipleChoiceField删除.values_list('classificationName', flat=True)

他们应该是这样的:

acctFilterName = forms.ModelChoiceField(
queryset=AccountFilters.objects.all(), 
label="Account Filters:", 
empty_label="Select Here...") 

excludeClassification = forms.ModelMultipleChoiceField(
queryset=ClassificationNames.objects.all(), 
label="Classifications Exclusion:") 

.values_list将剥离所有的ModelChoiceField需要认识到该项目中的数据的查询集,只留下您指定为参数的模型字段。也就是说,你在这里取消的是模型的基本关键。

+0

您所解释的问题是对象不允许您按名称选择下拉列表。 Values_list允许您选择名称。我认为在这里我还不了解其他的东西。 – Axwack

+0

你有2个选择来解决这个问题。 1:在你使用的模型上创建一个“def __unicode __(self):”方法,它返回你想要显示的下拉选项。 2:将一个to_field_name参数传递给ModelChoiceField,其中包含要渲染的字段的名称作为下拉选项。这两个选项都记录在此处:https://docs.djangoproject.com/en/1.8/ref/forms/fields/#modelchoicefield“to_field_name”下。 – Saturnix

+0

对不起,我错了。 “to_field_name”是模型的主键,而不是向用户显示的内容。显示给用户的是模型上“def __unicode__”方法的结果。 – Saturnix