Найти - Пользователи
Полная версия: error - Select a valid choice. [<some choice>] is not one of the available choices.
Начало » Django » error - Select a valid choice. [<some choice>] is not one of the available choices.
1
Denzil
Добрый день!

views.py

class AddLocationPageView(FormView):
    template_name = 'add_location.html'
    form_class = LocationForm
    success_url = '/add_location/location_added/'
    def form_valid(self, form):
        form.save()
        return super(AddLocationPageView, self).form_valid(form)

models.py

type_choices = (
('Рассвет/Закат', 'Рассвет/Закат'),('Ландшафт', 'Ландшафт'),('Природа', 'Природа'),
('Вода', 'Вода'),('Животные', 'Животные'),('Люди', 'Люди'),
('Архитектура', 'Архитектура'),('Город', 'Город'),('Астрофото', 'Астрофото'),
('Панорама', 'Панорама'),('Транспорт', 'Транспорт'),('Свадьба', 'Свадьба'),
)
equip_choices = (
('Tripod', 'Tripod'),('Shutter Release Cable', 'Shutter Release Cable'),('Filters', 'Filters'),
('Cleaning Equipment', 'Cleaning Equipment'),('Rain Cover', 'Rain Cover'),('Flash/speedlight', 'Flash/speedlight'),
('Flash Radio Triggers', 'Flash Radio Triggers'),('Light Modifiers', 'Light Modifiers'),
('Wide Angle Lens', 'Wide Angle Lens'),('Telephoto Lens', 'Telephoto Lens'),
('Prime Lens', 'Prime Lens'),('Macro Lens', 'Macro Lens'),('Assistant', 'Assistant'),
)
visit_choices = (
('Январь', 'Январь'),('Февраль', 'Февраль'),('Март', 'Март'),
('Апрель', 'Апрель'),('Май', 'Май'),('Июнь', 'Июнь'),
('Июль', 'Июль'),('Август', 'Август'),('Сентябрь', 'Сентябрь'),
('Октябрь', 'Октябрь'),('Ноябрь', 'Ноябрь'),('Декабрь', 'Декабрь'),
)
class Location(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    name = models.CharField(max_length=100, verbose_name="Локация", default='')
    types = models.CharField(max_length=50, verbose_name="Тип локации", choices=type_choices, default='')
    equipment = models.CharField(max_length=50, verbose_name="Рекомендуемая экипировка", choices=equip_choices, default='')
    visit_times = models.CharField(max_length=50, verbose_name="Лучшее время для съемки", choices=visit_choices, default='')
    photos = models.ImageField(upload_to='photos', null=True, blank=True)
    keywords = models.CharField(max_length=100, verbose_name="Ключевые слова", default='')
    description = models.TextField(null=True, blank=True)
    def __unicode__(self):
        return self.name

forms.py

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = ['name', 'types', 'equipment', 'visit_times', 'photos', 'keywords', 'description']
        widgets = {
        'name': forms.TextInput(attrs={'placeholder': 'Напр. Стоунхендж'}),
        'types': forms.SelectMultiple(),
        'equipment': forms.SelectMultiple(),
        'visit_times': forms.SelectMultiple(),
        'keywords': forms.TextInput(attrs={'placeholder': 'Напр. море, побережье, скалы'}),
        'description': forms.Textarea(attrs={'placeholder': 'Любая информация, которую посчитаете нужной'})
    }

Когда на странице заполняю поля и делаю выбор в полях селекта, то после нажатия кнопки на полях селекта выдает ошибку указанную в названии темы.

Спасибо за помощь!
FishHook
Сначала попридираюсь.
('Транспорт', 'Транспорт'),('Свадьба', 'Свадьба')
Самому не надоело копипастить?
ну можно же сделать как-то так
s = ["Транспорт", "Свадьба"]
choices = [(x, x) for x in s]
да и вообще, нафига хранить в БД текстовые данные, если вы ограничиваете их выбор? Храните номер, это дешевле.
type_choices = (
(1, 'Рассвет/Закат'),(2', 'Ландшафт'))

По сабжу:
'types': forms.SelectMultiple(),
как вы представляете себе сохранение нескольких значений в одной ячейке базы данных?
вот ваша модель
types = models.CharField(max_length=50, verbose_name="Тип локации", choices=type_choices, default='')
вы не запихаете туда несколько значений, только одно, а виджет (раз он мультипл) разумеется превращает данные в список. Список в ваше поле types записать нельзя.
Об этом говорит ошибка
Select a valid choice. [<some choice>] 
то что в квадратныхь скобках - это список
Denzil
спасибо большое за придирание!!! очень полезно (просто я новичок, поэтому еще много туплю )
и спасибо за подсказку!!!
я просто думал, что джанга устроит магию, когда я в модель передам choices ))))
а получается, что мне надо 1. создать отдельную модель 2. в нее передать choices 3. в основной модели сослаться через ManyToMAny ???

а какой тип поля тогда выбирать для этой отдельной модели?
а в виджетс тогда все-таки потом оставить SelectMultiple?
FishHook
Denzil
я просто думал, что джанга устроит магию, когда я в модель передам choices
А что по-вашему, должно было бы получиться в результате магии?
Может быть вам нужны формсеты?
Denzil
FishHook
А что по-вашему, должно было бы получиться в результате магии?

мне нужна страница с формой где я могу создавать локацию, которая имеет ряд характеристик… и, например, если я выбираю тип локации, то я должен иметь возможность выбрать для данной локации несколько типов
я сделал вот так:
class LocationType(models.Model):
    name = models.CharField(max_length=50, verbose_name="Тип локации", choices=type_choices, default='')

class Location(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
    types = models.ManyToManyField(LocationType, related_name='location_type')

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        widgets = {
            'types': forms.SelectMultiple(),
           }

но при этом в моей форме я не вижу чойсов… т.е. форма пустая
видимо это из-за CharField в LocationType.. подскажите, пжлст, какой тип поля мне надо поставить?
FishHook
Уберите вообще widgets.
Denzil
FishHook
Уберите вообще widgets.
убрал… все равно пустая форма select… без options
FishHook
class LocationForm(forms.ModelForm):
    def __init__(self, *args, *kw):
       super(LocationForm, self).__init__(*args, *kw)
       self.fields["types"].queryset = ....
    class Meta:
        model = Location
Denzil

FishHook
self.fields.queryset = ….

self.fields.queryset = LocationType.objects.all()

не работает все равно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB