我想实现一个适用于 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对此有更方便的解决方案吗? app engine/django 还有哪些其他类可以实现有效的实现?我应该像这样做我的选择吗:
choices = [ (1, _('Vehicles')), (2, _('Cars')), (3, _('Bicycles')), (4, _('Motorcycles')) ]
category=db.CategoryProperty(choices('0','1','2','3','4',default='1',verbose_name="Category")
最佳答案
CategoryProperty
只是一个具有语义名称的 StringProperty
:当它序列化为 XML 时,它使用不同的标记名称。真的,没有什么不同。
你的最后一个片段应该可以工作,但为什么要依赖整数索引呢?如果有一天你改变顺序,可能会出现问题。您可以使用字典代替:
choices = {
'vehicles': _('Vehicles'),
'cars': _('Cars'),
'bicycles': _('Bicycles'),
'motorcycles': _('Motorcycles')
}
category = db.CategoryProperty(choices=choices.keys(), default='cars',
verbose_name="Category")
关于python - 如何实现分类系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6938954/