Найти - Пользователи
Полная версия: Преобразовать <select> перед отображением
Начало » Django » Преобразовать <select> перед отображением
1
dezinfo
Столкнулся с задачей вывести многоуровневый <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>

Где <option disabled> это родительская категория.

модель
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)


форма которая выводит имя категории из Category

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>
FishHook
for name, field in self.fields.items():
      if name == 'location':

Ну ты даёшь!
self.fields['location'].widget.attrs.....
FishHook
В 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
FishHook
А в джанге есть возможность разбить варианты выбора по категориям.

Насколько я понял это вариант больше для статичных данных. Как быть с данными из DB, которые изменяются достаточно часто?
FishHook
dezinfo
Как быть с данными из DB, которые изменяются достаточно часто?
Вообще без разницы
my_field = ChoiceFileld()
....
self.fields["my_field"].choices = [.........]
dezinfo
FishHook
Вообще без разницы
my_field = ChoiceFileld()
….
self.fields.choices =

Может туплю, строго не судите, но на вход 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),
        )
    )
)

FishHook
dezinfo
но на вход choices
Ничего подобного, список тоже подойдет
dezinfo
((x.id, x.name) for x in cat )
Вы надеетесь таким способом сделать кортеж? Нифига подобного, это генератор.
FishHook
dezinfo
как заполнить в формате не могу понять
Сделайте обычный цикл for нужной вложенности, это же вы можете сделать?
dezinfo
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', 'Диски')))

т.е. необходим структуррированый список с правильно расставленными (
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