Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Преобразовать <select> перед отображением [RSS Feed]

#1 Авг. 25, 2015 22:08:20

dezinfo
Зарегистрирован: 2015-05-23
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

Столкнулся с задачей вывести многоуровневый <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>

Офлайн

#2 Авг. 26, 2015 05:24:00

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

for name, field in self.fields.items():
      if name == 'location':

Ну ты даёшь!
self.fields['location'].widget.attrs.....



Офлайн

#3 Авг. 26, 2015 05:26:59

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

В 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>



Офлайн

#4 Авг. 26, 2015 05:30:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

А в джанге есть возможность разбить варианты выбора по категориям.



Офлайн

#5 Авг. 26, 2015 08:29:14

dezinfo
Зарегистрирован: 2015-05-23
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

FishHook
А в джанге есть возможность разбить варианты выбора по категориям.

Насколько я понял это вариант больше для статичных данных. Как быть с данными из DB, которые изменяются достаточно часто?

Офлайн

#6 Авг. 26, 2015 09:01:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

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



Офлайн

#7 Авг. 26, 2015 23:25:55

dezinfo
Зарегистрирован: 2015-05-23
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

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),
        )
    )
)

Офлайн

#8 Авг. 27, 2015 05:48:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

dezinfo
но на вход choices
Ничего подобного, список тоже подойдет
dezinfo
((x.id, x.name) for x in cat )
Вы надеетесь таким способом сделать кортеж? Нифига подобного, это генератор.



Офлайн

#9 Авг. 27, 2015 05:49:23

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

dezinfo
как заполнить в формате не могу понять
Сделайте обычный цикл for нужной вложенности, это же вы можете сделать?



Офлайн

#10 Авг. 27, 2015 23:27:43

dezinfo
Зарегистрирован: 2015-05-23
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Преобразовать <select> перед отображением

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)

Офлайн

  • Начало
  • » Django
  • » Преобразовать <select> перед отображением [RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version