Как внедрить систему категорий - PullRequest
1 голос
/ 04 августа 2011

Я хочу реализовать структуру категорий, которая работает с i18n.Поскольку GAE имеет встроенную db.CategoryProperty, но она не реализует подкатегории, и кажется, что я использую свойство категории как объект списка со своими моделями.

class Vehicles(GeoModel,search.SearchableModel): 
  title=db.StringProperty(verbose_name="title")#required
  category=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Category") 
...

Не у всех транспортных средств есть коробка передач стипа ручной или автоматический но машины конечно делают.Таким образом, я могу добавить еще одну переменную экземпляра, gearbox = ..., но, поскольку для большинства случаев это не будет иметь смысла, следует избегать этой реализации и делать это с наследованием:

class Cars(Vehicles): 
  gearbox=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Gearbox"
  mileage=db.CategoryProperty(choices('0','1','2','3','4','5',default='1',verbose_name="Mileage"
  fuel=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Fuel"

Является ли решение с наследованием предпочтительным по сравнению спросто добавление переменных экземпляра подкатегорий в качестве переменных экземпляра в базовом классе?Будут ли работать категории объектов, если я буду использовать наследование?Как я могу реализовать варианты, чтобы он перебирал категории с i18n?Мой шаблон в настоящее время выглядит так:

{% load i18n %}
<select name="cg" id="cat" class="category"> 
<option value='' style='background-color:#dcdcc3' id='cat1' >-- {% trans "VEHICLES" %} --</option>
<option value='2'  {% ifequal "2" cg %} selected="selected" {% endifequal %} id='cat2' >{% trans "Cars" %}</option>
...

Есть ли у django более удобное решение для этого?Какие еще классы имеет движок приложений / django, который может обеспечить работающую реализацию?Должен ли я вместо этого делать свой выбор:

 choices = [ (1, _('Vehicles')), (2, _('Cars')), (3, _('Bicycles')), (4, _('Motorcycles')) ]
 category=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Category") 

1 Ответ

2 голосов
/ 04 августа 2011

CategoryProperty - это просто StringProperty с семантическим именем: когда он сериализуется в XML, он использует другое имя тега. На самом деле, ничто не отличается.

Ваш последний фрагмент должен работать, но зачем полагаться на целочисленные индексы? Это может быть проблематично, если вы измените заказ в один прекрасный день. Вместо этого вы можете использовать dict:

choices = {
    'vehicles': _('Vehicles'),
    'cars': _('Cars'),
    'bicycles': _('Bicycles'),
    'motorcycles': _('Motorcycles')
}
category = db.CategoryProperty(choices=choices.keys(), default='cars',
                               verbose_name="Category")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...