简体   繁体   中英

Django Form is Always Invalid with ChoiceField - Select a Valid Choice

I recently added a ChoiceField to my form but now it always returns invalid; I verified this with a 'print(form.is_valid())'. All fields are displayed properly in my template and values are always being passing so I can't fathom why the form is returned as invalid.

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)

This is online database so I use the modelform to create the item and the form to search through and pull the results. Therefore, I need both to work.

EDIT:

I discovered it was selecting an invalid choice. Ideas how to fix this?

A ModelChoiceField should be referring to a queryset to generates its choices. In your example, you show:

Investment_Level = forms.ModelChoiceField(queryset=CATEGORIES,)

You don't show what CATEGORIES is, but typically you would do something like:

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

If you actually want the dropdown to display hard-coded choices from constants, you should be using a regular ChoiceField, not a ModelChoiceField.

This is online database so I use the modelform to create the item

No, you're not. That's why you have so much duplicate code and the problem. Use an actual ModelForm :

from .models import Lead

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM