Django表单在模型表单

时间:2015-11-19 21:33:30

标签: python django django-models django-forms

我还在学习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

2 个答案:

答案 0 :(得分:1)

尝试从.values_list('acctFilterName', flat=True)移除ModelChoiceField,然后从.values_list('classificationName', flat=True)移除ModelMultipleChoiceField

他们应该是这样的:

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识别项目所需的所有数据的查询集,只留下您指定的模型字段作为参数。也就是说,你在这里删除的是模型的主键,这是基本的。

答案 1 :(得分:-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:')
        }