Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 15, 2012 07:01:17

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

Помогите разобраться с тем как работает choices

Есть модель в которой есть такой столбец

TelBook = models.CharField(max_length=3, choices=YESNOCHOICE)
код переменной для choices
	YESNOCHOICE = (
('Yes', 'Да'),
('No', 'Нет'),
)
и шаблон html страницы куда выводятся переменные, в том числе и эта
{% for DV in DeviceList %}
...
<tr><td>Телефонная книга</td><td>{{ DV.TelBook}}</td></tr>
...
{% endfor %}
На сайте разработчиков функция на английском описана так:
(перевод)“Первый элемент в каждом кортеже - фактическое значение, которое будет сохранено. Второй элемент - удобочитаемое название выбора.”

Получается, что в базу данных сохраняется первый элемент кортежа, в моём случае значения ‘Yes’ или ‘No’.
В админке, когда заполняю значения, то в меню выбора значения отображаются по второму элементу кортежа, всё совпадает с описанием действия функции.

А теперь подскажите, django эти значения заменяет только в админке или так же и в шаблон документа, куда будут выводится данные?

У меня значение переменной {{ DV.TelBook}} в шаблоне выводится как Yes или No (т.е. 1й элемент кортежа) а не заменяется на 2 элемент кортежа, что крайне не удобно.

Версия Django: (1, 3, 0, ‘final’, 0)
Ubuntu 11.10 Server
Apache 2.2.20-1ubuntu1.1
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)



Отредактировано (Янв. 15, 2012 07:02:45)

Офлайн

#2 Янв. 15, 2012 07:57:57

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

Обошёл проблему через использование через ForeignKey, не знаю насколько это правильно, но по крайней мере работает

class YesNoChoice(models.Model):
YNC = models.CharField(max_length=3)
def __unicode__(self):
return self.YNC
TelBook = models.ForeignKey(YesNoChoice, related_name='TelBook_choice')



Офлайн

#3 Янв. 15, 2012 17:50:03

magnet85
От:
Зарегистрирован: 2009-04-13
Сообщения: 91
Репутация: +  2  -
Профиль   Отправить e-mail  

choices

В шаблоне

{% for DV in DeviceList %}
...
<tr><td>Телефонная книга</td><td>{{ DV.get_TelBook_display }}</td></tr>
...
{% endfor %}
И ещё совет, не нужно называть так переменные, прочтите code style



Офлайн

#4 Янв. 16, 2012 03:30:03

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

choices

IRON
Помогите разобраться с тем как работает choices

Есть модель в которой есть такой столбец
TelBook = models.CharField(max_length=3, choices=YESNOCHOICE)
код переменной для choices
	YESNOCHOICE = (
('Yes', 'Да'),
('No', 'Нет'),
)
и шаблон html страницы куда выводятся переменные, в том числе и эта
{% for DV in DeviceList %}
...
<tr><td>Телефонная книга</td><td>{{ DV.TelBook}}</td></tr>
...
{% endfor %}
На сайте разработчиков функция на английском описана так:
(перевод)“Первый элемент в каждом кортеже - фактическое значение, которое будет сохранено. Второй элемент - удобочитаемое название выбора.”

Получается, что в базу данных сохраняется первый элемент кортежа, в моём случае значения ‘Yes’ или ‘No’.
В админке, когда заполняю значения, то в меню выбора значения отображаются по второму элементу кортежа, всё совпадает с описанием действия функции.

А теперь подскажите, django эти значения заменяет только в админке или так же и в шаблон документа, куда будут выводится данные?

У меня значение переменной {{ DV.TelBook}} в шаблоне выводится как Yes или No (т.е. 1й элемент кортежа) а не заменяется на 2 элемент кортежа, что крайне не удобно.

Версия Django: (1, 3, 0, ‘final’, 0)
Ubuntu 11.10 Server
Apache 2.2.20-1ubuntu1.1
Python 2.7.2+ (default, Oct 4 2011, 20:03:08)
Второй элемент кортежа заменяется на первый если из модели сделать форму с полем Select.
<option value=“yes”>Да</option>
<option value=“no”>Нет</option>



Офлайн

#5 Янв. 17, 2012 17:37:51

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

Спасибо, теперь понятно всё)



Офлайн

#6 Янв. 23, 2012 08:05:51

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

magnet85
В шаблоне
{% for DV in DeviceList %}
...
<tr><td>Телефонная книга</td><td>{{ DV.get_TelBook_display }}</td></tr>
...
{% endfor %}
И ещё совет, не нужно называть так переменные, прочтите code style
{{ DV.get_TelBook_display }} - так же отображает первый элемент кортежа.



Офлайн

#7 Янв. 23, 2012 08:08:51

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

FishHook
Второй элемент кортежа заменяется на первый если из модели сделать форму с полем Select.
<option value=“yes”>Да</option>
<option value=“no”>Нет</option>
Форма select не подходит, ибо мне нужно просто выводить значение.
Пока наиболее правильно работает через
TelBook = models.ForeignKey(YesNoChoice, related_name='TelBook_choice')
но, при использовании такого подхода, при добавлении второй записи использующей данную модель mysql встаёт позу “зю” с нагрузкой cpu 100%… при этом даже последующее обращение к странице вызывает такое поведение. Помогает только restart сервиса mysql
вечером буду дебажить=)



Отредактировано (Янв. 23, 2012 08:41:34)

Офлайн

#8 Янв. 23, 2012 09:14:53

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

choices

IRON
FishHook
Второй элемент кортежа заменяется на первый если из модели сделать форму с полем Select.
<option value=“yes”>Да</option>
<option value=“no”>Нет</option>
Форма select не подходит, ибо мне нужно просто выводить значение.
Пока наиболее правильно работает через
TelBook = models.ForeignKey(YesNoChoice, related_name='TelBook_choice')
но, при использовании такого подхода, при добавлении второй записи использующей данную модель mysql встаёт позу “зю” с нагрузкой cpu 100%… при этом даже последующее обращение к странице вызывает такое поведение. Помогает только restart сервиса mysql
вечером буду дебажить=)
Как то так, хотя и похоже на говнокод

Модель:
class ChoicesDict(models.Model):
YESNOCHOICE = (
('Yes', 'Да'),
('No', 'Нет'),
)
choice = CharField(u'Выбор', max_length = 3)


class TelBooks(models.Model):
tel_book = models.ForeignKey( ChoicesDict)
View
def overview(request):

t_b=TelBooks.objects.all()
choices=dict(ChoicesDict.YESNOCHOICE)
result=[choices[i.tel_book] for i in t_b]
return render_to_response("index.html", {'result':result})
Template
{% for i in result %}
......



Офлайн

#9 Янв. 23, 2012 09:22:16

IRON
От:
Зарегистрирован: 2012-01-15
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

choices

в чём принципиальная разница?



Офлайн

#10 Янв. 23, 2012 09:29:30

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

choices

IRON
в чём принципиальная разница?
IRON
но, при использовании такого подхода, при добавлении второй записи использующей данную модель mysql встаёт позу “зю” с нагрузкой cpu 100%… при этом даже последующее обращение к странице вызывает такое поведение. Помогает только restart сервиса mysql



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version