【问题标题】:Django Form is Always Invalid with ChoiceField - Select a Valid Choice使用 ChoiceField 的 Django 表单始终无效 - 选择一个有效的选择
【发布时间】:2017-09-08 18:21:42
【问题描述】:

我最近在表单中添加了一个 ChoiceField,但现在它总是返回无效;我用'print(form.is_valid())'验证了这一点。所有字段都在我的模板中正确显示,并且值总是在传递,所以我无法理解为什么表单被返回为无效。

models.py

class Lead(models.Model):
    Company_Name = models.CharField(max_length=180, default="No_Name", blank=True)
    Company_ID = models.BooleanField(default=True)
    Client_Name = models.CharField(max_length=180, default="No_Name_Provided", blank=True)
    Client_ID = models.BooleanField(default=True)
    Advertising = models.BooleanField(default=False)
    Automotive = models.BooleanField(default=False)
    Storage = models.BooleanField(default=False)
    Child_Related = models.BooleanField(default=False)
    Cleaning = models.BooleanField(default=False)
    Coffee = models.BooleanField(default=False)
    Computer = models.BooleanField(default=False)
    Internet = models.BooleanField(default=False)
    Dry_Cleaning = models.BooleanField(default=False)
    Education = models.BooleanField(default=False)
    Employment = models.BooleanField(default=False)
    Financial_Services = models.BooleanField(default=False)
    Fitness = models.BooleanField(default=False)
    Food = models.BooleanField(default=False)
    Eco_Friendly = models.BooleanField(default=False)
    Hair_Care_Beauty_Salon = models.BooleanField(default=False)
    Health = models.BooleanField(default=False)
    Nutrition = models.BooleanField(default=False)
    Home_Services = models.BooleanField(default=False)
    Maintenance = models.BooleanField(default=False)
    Management = models.BooleanField(default=False)
    Training = models.BooleanField(default=False)
    Miscellaneous = models.BooleanField(default=False)
    Pack_and_Mail = models.BooleanField(default=False)
    Pet_Related = models.BooleanField(default=False)
    Print_Copy = models.BooleanField(default=False)
    Real_Estate = models.BooleanField(default=False)
    Repair_Restoration = models.BooleanField(default=False)
    Retail = models.BooleanField(default=False)
    Senior_Care = models.BooleanField(default=False)
    Sports = models.BooleanField(default=False)
    Tanning_Salon = models.BooleanField(default=False)
    Travel = models.BooleanField(default=False)
    Vending = models.BooleanField(default=False)
    Home_Based = models.BooleanField(default=False)
    Investment_Level = models.CharField(max_length=2, choices=CATEGORIES, default=CATEGORIES[0])

forms.py

class FormForReq(forms.Form):
    Company_Name = forms.CharField(max_length=180, required=False)
    Client_Name = forms.CharField(max_length=180, required=False)
    category = forms.BooleanField(initial=False, required=False)
    From_Home = forms.BooleanField(initial=False, required=False)
    Advertising = forms.BooleanField(initial=False, required=False)
    Automotive = forms.BooleanField(initial=False, required=False)
    Storage = forms.BooleanField(initial=False, required=False)
    Child_Related = forms.BooleanField(initial=False, required=False)
    Cleaning = forms.BooleanField(initial=False, required=False)
    Coffee = forms.BooleanField(initial=False, required=False)
    Computer = forms.BooleanField(initial=False, required=False)
    Internet = forms.BooleanField(initial=False, required=False)
    Dry_Cleaning = forms.BooleanField(initial=False, required=False)
    Education = forms.BooleanField(initial=False, required=False)
    Employment = forms.BooleanField(initial=False, required=False)
    Financial_Services = forms.BooleanField(initial=False, required=False)
    Fitness = forms.BooleanField(initial=False, required=False)
    Food = forms.BooleanField(initial=False, required=False)
    Eco_Friendly = forms.BooleanField(initial=False, required=False)
    Hair_Care_Beauty_Salon = forms.BooleanField(initial=False, required=False)
    Health = forms.BooleanField(initial=False, required=False)
    Nutrition = forms.BooleanField(initial=False, required=False)
    Home_Services = forms.BooleanField(initial=False, required=False)
    Maintenance = forms.BooleanField(initial=False, required=False)
    Management = forms.BooleanField(initial=False, required=False)
    Training = forms.BooleanField(initial=False, required=False)
    Miscellaneous = forms.BooleanField(initial=False, required=False)
    Pack_and_Mail = forms.BooleanField(initial=False, required=False)
    Pet_Related = forms.BooleanField(initial=False, required=False)
    Print_Copy = forms.BooleanField(initial=False, required=False)
    Real_Estate = forms.BooleanField(initial=False, required=False)
    Repair_Restoration = forms.BooleanField(initial=False, required=False)
    Retail = forms.BooleanField(initial=False, required=False)
    Senior_Care = forms.BooleanField(initial=False, required=False)
    Sports = forms.BooleanField(initial=False, required=False)
    Tanning_Salon = forms.BooleanField(initial=False, required=False)
    Travel = forms.BooleanField(initial=False, required=False)
    Vending = forms.BooleanField(initial=False, required=False)
    Home_Based = forms.BooleanField(initial=False, required=False)
    Investment_Level = forms.ModelChoiceField(queryset=CATEGORIES, required=False)

这是一个在线数据库,所以我使用模型表单来创建项目和表单来搜索并提取结果。因此,我需要两者都工作。

编辑:

我发现它选择了一个无效的选项。想法如何解决这个问题?

【问题讨论】:

  • 尝试打印错误:print(form.errors) 并发布你得到的内容
  • 你向我们展示了很多对解决这个问题没有帮助的东西,并且遗漏了我们需要看到的东西。由于唯一的 ChoiceField 是 Investment_Level,这就是我们需要在这里看到的全部内容。它显然使用了 queryset=CATEGORIES,所以我们需要看看是什么创建了该查询。
  • @JahongirRahmonov 我这样做并解决了我的问题。谢谢:D

标签: python django forms


【解决方案1】:

这是在线数据库,所以我使用模型表单来创建项目

不,你不是。这就是为什么你有这么多重复的代码和问题。使用实际的ModelForm

from .models import Lead

class FormForReq(forms.ModelForm):
    class Meta:
        model = Lead
        fields = '__all__'

【讨论】:

    【解决方案2】:

    ModelChoiceField 应该引用查询集以生成其选择。在您的示例中,您显示:

    Investment_Level = forms.ModelChoiceField(queryset=CATEGORIES,)
    

    您没有显示CATEGORIES 是什么,但通常您会执行以下操作:

    Investment_Level = forms.ModelChoiceField(queryset=Foo.objects.all(),)
    

    如果您确实希望下拉菜单显示来自常量的硬编码选项,您应该使用常规的 ChoiceField,而不是 ModelChoiceField。

    【讨论】:

      猜你喜欢
      • 2011-12-13
      • 2016-07-23
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2020-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多