How to use a choiceField declared in the model, in a form. django

15,983

Solution 1

Move your choices to be above the model, in the root of your models.py:

marcas = (
        ('chevrolet', 'Chevrolet'),
        ('mazda', 'Mazda'),
        ('nissan', 'Nissan'),
        ('toyota', 'Toyota'),
        ('mitsubishi', 'Mitsubishi'),)

class Marca(models.Model):

    marca = models.CharField(max_length=25,choices=marcas)

Then in your file where you declare the form:

from yourapp.models import marcas

class VehiculoForm(forms.Form):

     marca = forms.ChoiceField(choices=marcas)

I also fixed some other problems for you:

  • Class names should start with a capital letter
  • You need to increase the max_length of your character field because you are storing the word chevrolet anytime someone will select Chevrolet in the choice drop down.

If you are just creating a form to save records for Marca model, use a ModelForm, like this:

from yourapp.models import Marca

class VehiculoForm(forms.ModelForm):
     class Meta:
         model = Marca

Now, django will render the choice field automatically.

Solution 2

You need to define the choices tuple marcas outside of model class class marca.

Then you can do following in forms.py to use

from models import marcas

class addVehiculoForm(forms.Form):
    marca  = forms.CharField(max_length=2, widget=forms.Select(choices= marcas))
    ...
Share:
15,983

Related videos on Youtube

Hugo Montoya
Author by

Hugo Montoya

Updated on September 15, 2022

Comments

  • Hugo Montoya
    Hugo Montoya over 1 year

    I have this in my model.py

    class marca(models.Model):
        marcas = (
            ('chevrolet', 'Chevrolet'),
            ('mazda', 'Mazda'),
            ('nissan', 'Nissan'),
            ('toyota', 'Toyota'),
            ('mitsubishi', 'Mitsubishi'),
        )
    
        marca = models.CharField(max_length=2, choices= marcas)
        def __unicode__(self):
            return self.marca
    

    And I need to use it in my form.py I tried this but it doesn't work.

    class addVehiculoForm(forms.Form):
        placa                   = forms.CharField(widget = forms.TextInput())
        tipo                    = forms.CharField(max_length=2, widget=forms.Select(choices= tipos_vehiculo))
        marca                   = forms.CharField(max_length=2, widget=forms.Select(choices= marcas))
    
  • Julio Marins
    Julio Marins about 6 years
    there is no choices on forms.CharField. super(CharField, self).__init__(*args, **kwargs) TypeError: __init__() got an unexpected keyword argument 'choices'
  • Burhan Khalid
    Burhan Khalid about 6 years
    Typo, it should be forms.ChoiceField