Python Django表单在模型表单上无效

Python Django表单在模型表单上无效,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我还在学Django。我有一个类似向导的表单工作流,其中每个表单都在连续填写信息 我有一个模型表单,表示我希望从表单中输入的内容: 型号.py class AccountParameters(models.Model): acctFilterName = models.ForeignKey(AccountFilters) excludeClassification = models.ManyToManyField(ClassificationNames) tradingCash

我还在学Django。我有一个类似向导的表单工作流,其中每个表单都在连续填写信息

我有一个模型表单,表示我希望从表单中输入的内容:

型号.py

class AccountParameters(models.Model):
   acctFilterName = models.ForeignKey(AccountFilters)
   excludeClassification = models.ManyToManyField(ClassificationNames)
   tradingCash = models.FloatField()
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})
Forms.py

class AccountParameters(models.Model):
   acctFilterName = models.ForeignKey(AccountFilters)
   excludeClassification = models.ManyToManyField(ClassificationNames)
   tradingCash = models.FloatField()
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})
这是一个简化的表单,并不代表真正的实现。这是为了测试

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:')
    }
我不确定我是否正确使用了Modelforms。我需要的是一种为我的acctFilterName创建选择下拉列表的方法,因此我手动创建了查询集

当我保存表单时,它无效,在表单清理数据中,我得到以下信息: 请注意,清理后的数据只有tradingCash字段

我做错了什么?有更好的方法吗?为什么表格是有效的


为什么要重新说明
AccountSelectionForm
模型表单上的字段

这样更好:

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:')
        }

尝试从
ModelChoiceField
中删除
.values\u列表('acctFilterName',flat=True)
,并从
ModelChoiceField
中删除
.values\u列表('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:")


将删除查询集中ModelChoiceField识别该项所需的所有数据,只保留指定为参数的模型字段。也就是说,这里要删除的是基本模型的主键。

views.py中的哪个位置保存了表单?我没有,因为form.is\u valid()不适用于堆栈溢出。这应该是一个评论,不应该作为答案出现,请先将您的问题发布到评论部分。对不起,我还不能评论:(,声誉不够。这是因为我不了解它的工作原理。AcctFilter是一个查找。我希望将其作为modelchoice字段查询到后端,但无法执行此操作。请注意,在queryset中,我显式填充了小部件的值。不需要这样做,您可以执行:
def\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuself,*args,**kwargs):self.fields['excludeClassification'].queryset=ClassificationNames.objects.all().values\u list('classificationName',flat=True)
您所解释的问题是,对象不允许您按名称选择下拉列表。值列表允许您选择名称。我想这里还缺少一些我不理解的内容。您有两个选项来解决此问题。1:创建“def\uu unicode\uuu(self):”方法,该方法返回要显示为下拉选项的内容。2:将to_field_name参数传递给ModelChoiceField,该参数包含要呈现为下拉选项的字段的名称。这两个选项都记录在此处:“to_field_name”下。抱歉,我错了。“to_field_name”是模型的主键,而不是向用户显示的内容。向用户显示的内容是“def unicode”的结果方法。在这里,将此代码放入您的模型中,让它返回您希望显示为选项的内容给您的用户:谢谢。但是,这里是文档所说的内容:Object1 Object2…问题是Object1显示的是对象的字符串,而不是对象的名称。我一定缺少什么。我无法想象这个小部件将在每个选定的文本跨栏上生成。