Как использовать поле выбора, объявленное в модели, в форме. Джанго


У меня это в моем 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

И мне нужно использовать его в моем form.py Я пытался это сделать, но ничего не вышло.

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))
3 2

3 ответа:

Переместите свой выбор выше модели, в корень Вашего 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)

Затем в вашем файле, где вы объявляете форму:

from yourapp.models import marcas

class VehiculoForm(forms.Form):

     marca = forms.ChoiceField(choices=marcas)

Я также исправил некоторые другие проблемы для вас:

  • имена классов должны начинаться с заглавной буквы
  • вам нужно увеличить max_length вашего поля символов, потому что вы сохраняете слово chevrolet в любое время, когда кто-то выберет Chevrolet в выпадающем списке выбора.

Если вы просто создаете форму для сохранения записей для модели Marca используйте a ModelForm, вот так:

from yourapp.models import Marca

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

Теперь django автоматически отобразит поле выбора.

Вам нужно определить кортеж выбора marcas вне класса модели class marca.

Тогда вы можете сделать следующее в forms.py использовать

from models import marcas

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

Я предпочитаю держать выбор все еще внутри модели, чтобы он не смешивался с другими моделями. Тогда решение будет следующим:

Models.py:

Same as in question.

Forms.py:

from yourapp.models import marca

class VehiculoForm(forms.Form):
     marca = forms.ChoiceField(choices=marca.marcas)

     class Meta:
         model = marca
         fields= ('marca')

Вы также можете просто определить meta, если вам нужны поля модели по умолчанию.