Форум сайта python.su
Столкнулся с задачей вывести многоуровневый <select> в форме на основании модели.
необходимо построить что то вроде
<select> <option disabled>Авто</option> <option value="Audi">--Audi</option> <option value="BMW">--BMW</option> <option value="BMW"> --BMW</option> <option disabled>Мото</option> <option value="BMW">--BMW</option> </select>
class MainGroup(models.Model): name = models.CharField(max_length=150) def __str__(self): # __unicode__ on Python 2 return self.name class Category(models.Model): maingroup = models.ForeignKey(MainGroup,verbose_name='Группа') name = models.CharField(max_length=40,verbose_name='Категория',unique=True)
class ZipForm(ModelForm): def __init__(self, *args, **kwargs): super(ZipForm, self).__init__(*args, **kwargs) for name, field in self.fields.items(): if name == 'location': field.widget.attrs.update({'class':"form-control", 'data-val':"true", 'data-val-length':"Максимальная длинна заголовка 200 символов", 'data-val-length-max':"200", 'data-val-required':"Поле является обязательным к заполнению" , 'id':"location", 'maxlength':"200", 'name':"location", 'placeholder':"Укажите месторасположения", 'required':"True", 'type':"select", 'value':"", 'aria-required':"true"}) elif name =='category': field.widget.attrs.update({'class':"form-control", 'data-val':"true", 'data-val-length':"Максимальная длинна заголовка 200 символов", 'data-val-length-max':"200", 'data-val-required':"Поле является обязательным к заполнению" , 'id':"category", 'maxlength':"200", 'name':"category", 'placeholder':"Укажите категорию", 'required':"True", 'type':"select", 'value':"Укажите категорию"})
<select class="form-control" name="category" placeholder="Укажите категорию" required="True" type="select" value="Укажите категорию"> <option value="" selected="selected">---------</option> <option value="1"> Audi</option> <option value="2">Acura</option> <option value="3">BMW</option> <option value="4">Lexus</option> <option value="5">Porshe</option> <option value="6">Мото</option> <option value="7">Скутера</option> <option value="8">Квадроциклы</option> <option value="9">Гидроциклы</option> <option value="10">Автобусы</option> <option value="11">Шины</option> <option value="12">Диски</option> </select>
Офлайн
for name, field in self.fields.items(): if name == 'location':
self.fields['location'].widget.attrs.....
Офлайн
В HTML есть группирующий тег специально для категорий
<select> <optgroup label="Swedish Cars"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> </optgroup> <optgroup label="German Cars"> <option value="mercedes">Mercedes</option> <option value="audi">Audi</option> </optgroup> </select>
Офлайн
А в джанге есть возможность разбить варианты выбора по категориям.
Офлайн
FishHook
А в джанге есть возможность разбить варианты выбора по категориям.
Офлайн
dezinfoВообще без разницы
Как быть с данными из DB, которые изменяются достаточно часто?
my_field = ChoiceFileld() .... self.fields["my_field"].choices = [.........]
Офлайн
FishHook
Вообще без разницы
my_field = ChoiceFileld()
….
self.fields.choices =
self.fields["category"].choices =((x.id, x.name) for x in cat )
( ('y.name', ( (x.id, x.name), (x.id1, x.name1), ) ), ('y.name1', ( (x.id, x.name), (x.id1, x.name1), ) ) )
Офлайн
dezinfoНичего подобного, список тоже подойдет
но на вход choices
dezinfoВы надеетесь таким способом сделать кортеж? Нифига подобного, это генератор.((x.id, x.name) for x in cat )
Офлайн
dezinfoСделайте обычный цикл for нужной вложенности, это же вы можете сделать?
как заполнить в формате не могу понять
Офлайн
FishHook
Сделайте обычный цикл for нужной вложенности, это же вы можете сделать?
for i in group: if len(tt)<=0: tt=[(i.name)] else: tt.append(i.name) for n in Category.objects.filter(maingroup_id=i.id): tt.append((str(n.id), n.name),) print(tt) 'Автомобили и части', ('1', ' Audi'), ('2', 'Acura'), ('3', 'BMW'), ('4', 'Lexus'), ('5', 'Porshe'), 'Другой транспорт', ('6', 'Мото'), ('7', 'Скутера'), ('8', 'Квадроциклы'), ('9', 'Гидроциклы'), ('10', 'Автобусы'), 'Шины\\Диски', ('11', 'Шины'), ('12', 'Диски')
('Автомобили и части', (('1', ' Audi'), ('2', 'Acura'), ('3', 'BMW'), ('4', 'Lexus'), ('5', 'Porshe'))), ('Другой транспорт', (('6', 'Мото'), ('7', 'Скутера'), ('8', 'Квадроциклы'), ('9', 'Гидроциклы'), ('10', 'Автобусы'))),('Шины\\Диски', (('11', 'Шины'), ('12', 'Диски')))
Отредактировано dezinfo (Авг. 28, 2015 07:16:46)
Офлайн