改进django选择的小助手应用程序(用于字段)

django-extended-choices的Python项目详细描述


django扩展选项

一点应用程序来改进django选项

django扩展选项旨在提供更好的可读性 在django中使用选项的方式。

安装

您可以直接通过pip安装(因为版本 0.3 ):

$ pip install django-extended-choices

或者从 github 存储库( master 默认分支):

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install

用法

其目的是替换此项:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))

据此:

fromextended_choicesimportChoicesSTATES=Choices(('ONLINE',1,'Online'),('DRAFT',2,'Draft'),('OFFLINE',3,'Offline'),)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATES,default=STATES.DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATES.for_value(self.state).display)print(Content.objects.filter(state=STATES.ONLINE))

如您所见,所有状态只有一个声明,每个状态的声明顺序如下:

  • 可以使用的伪常量名( states.online 代替以前的 state\u online
  • 要在数据库中使用的值-它也可以是字符串
  • 要显示的名称-如果需要i18n,您可以用 ugettext_lazy() 将文本包装起来

然后,您可以使用:

  • states states.choices ,与字段声明中的 choices= 一起使用
  • 状态。对于_constant(constant) ,从常量名中获取选择项
  • 状态。对于u值(常量) ,从数据库中使用的键获取选择项
  • 状态。对于显示(常量) ,从可显示值中获取选择项(在某些情况下可能有用)

通过 获得的每个选项项对于_常量 对于_值 对于_显示 返回一个元组作为 提供给 选项的构造函数,但带有附加属性:

>>>entry=STATES.for_constant('ONLINE')>>>entry==('ONLINE',1,'Online')True>>>entry.constant'ONLINE'>>>entry.value1>>>entry.display'Online'

这些属性是可链接的(使用一个奇怪的示例来查看可链接性):

>>>entry.constant.value1>>>entry.constant.value.value.display.constant.display'Online'

为此,我们必须删除对 none 值的支持。请改用空字符串。

注意,如果 你想与你的IDE战斗,它可能会警告你未定义的属性。

您可以直接检查值是否在 选项中 对象中:

>>>1inSTATESTrue>>>42inSTATESFalse

您甚至可以在 choices 对象上迭代以获得django看到的选项:

>>>forchoiceinSTATES:...print(choice)(1,'Online')(2,'Draft')(3,'Offline')

要获取给定给 选项 对象的所有选项项,可以使用 属性:

>>>forchoice_entryinSTATES.entries:...print(choice_entry)('ONLINE',1,'Online'),('DRAFT',2,'Draft'),('OFFLINE',3,'Offline'),

或以下命令,使用常量、值或显示名称作为键,以及 选择条目作为值:

  • 状态.常数
  • 状态。值
  • 状态。显示
$ pip install django-extended-choices
0

如果你想把这些听写整理好,你可以通过听写课使用 选项 构造函数:

$ pip install django-extended-choices
1

由于version 1.1 ,因此提供了新的 orderedchoices 类,即: a 选项 默认使用 ordereddict 用于 dict类 。您可以直接导入 它来自 扩展选项

您可以检查是否存在常量、值或显示名称:

$ pip install django-extended-choices
2

您可以在同一个 选项中创建选项子集 实例:

$ pip install django-extended-choices
3

现在, states.not_online 是一个真正的 选项 实例,有一个子集的主 状态 常数。

当您只需要一个子集可用时,可以使用它生成选项:

$ pip install django-extended-choices
4

由于子集是一个真正的 选项 实例,因此您具有相同的属性和方法:

$ pip install django-extended-choices
5

您可以创建任意数量的子集,如果需要,可以重用相同的常量:

$ pip install django-extended-choices
6

如果要检查子集中的成员资格,可以执行以下操作:

$ pip install django-extended-choices
7

如果要根据子集中的值筛选queryset,可以使用 ,但由于 是dict,因此 keys() 必须是user:

$ pip install django-extended-choices
8

您可以使用 add_choices 在许多步骤中添加选项项,可能在 同时。

要构造与以前相同的 选项,我们可以这样做:

$ pip install django-extended-choices
9

您还可以将 参数 传递给 选项 构造函数,以创建一个子集 同时添加的选项条目(它将用名称和 条目)

现有子集名称的列表位于父 选项的 子集 属性中 对象:< /P>

如果您想要选项的子集,但不将其保存在原始的 选项 对象中,则可以 使用"提取子集"而不是"添加子集"

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
0

对于由 add_subset 创建的子集,您有一个真正的 选择对象,但不可访问 从最初的 选择对象。

注意,在extract_subset中,直接传递字符串,而不是在列表/元组中传递 add_subset 的第二个参数

其他属性

每个元组必须包含三个元素。但是,您可以将dict作为第四个dict传递,该dict的每个条目都将保存为一个属性 选项项的

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
1

自动显示/数值

我们提供两个课程,以方便您的选择,参加您不需要翻译的显示值。

自动选择

这是一个更简单、更快的版本:您刚刚通过常量并且:

  • 保存在数据库中的值将是常量小写
  • 显示值为常数,用空格替换,第一个字母大写
$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
2

如果要传递其他属性,请传递一个以dict作为最后一个元素的元组:

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
3

您可以通过传递 值转换 向构造函数显示转换 函数。

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
4

如果您发现自己排斥这些转换函数,则可以有一个基类将这些函数定义为类属性:

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
5

当然,您仍然可以通过将函数传递给构造函数来重写这些函数。

如果需要,对于条目,强制指定一个值,只需将其作为第二个参数传递即可:

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
6

如果要设置显示,请传递第三个:

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
7

若要强制显示值,但要自动计算db值,请对第二个参数使用 none

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
8

自动显示选项

在此版本中,必须定义要保存在数据库中的值。显示值将像在汽车选择中那样作曲

$ git clone git://github.com/twidi/django-extended-choices.git
$ cd django-extended-choices
$ sudo python setup.py install
9

如果要传递其他属性,请传递一个以dict作为最后一个元素的元组:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
0

与在autochoices中一样,您可以通过向 建造商。

如果需要,对于条目,强制特定显示,只需将其作为第三个参数传递即可:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
1

注释

  • 在扩展选项中还有一个非常基本的字段( namedxtendedchoiceformfield` ),它接受常量名称而不是值
  • 请随意阅读源代码,以了解有关这个小django应用程序的更多信息。
  • 你可以在你想要的地方宣布你的选择。我的用法在 models.py 文件中,就在类声明之前。

兼容性

版本 1.0 提供了一个全新的api,并且与前一个api兼容 ( 0.4.1 )在 1.1 中被去除。最后一个兼容版本是 1.0.7

如果您需要这种兼容性,可以通过将特定版本固定在您的需求中来使用它。

许可证

可在 bsd 许可下获得。请参见包含的 许可证 文件

python/django版本支持

<表> < COLGROUP > < COL/> < COL/> <正文> django版本 python版本 1.8、1.9、1.10 2.7、3.4、3.5 1.11 2.7、3.4、3.5、3.6 2.0 3.4、3.5、3.6、3.7 2.1,2.2 3.5、3.6、3.7 <表>

测试

要从代码源运行测试,请创建一个virtualenv或激活一个virtualenv,安装django,然后:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
2

我们还在代码文档中提供了一些快速的doctest。执行它们:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
3

注意:doctests只在python版本中工作,不显示字符串的前缀。

源代码

源代码可以在github上找到。

开发

如果您想参与这个库的开发,您需要 django 安装在您的virtualenv中。如果没有,只需运行:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
4

不要忘记运行测试;)

欢迎在github上提出请求请求!

拉取请求后几分钟,将对所有版本的travis ci执行测试 我们支持python和django。

文档

有关文档,请参见

要更新文档,您需要一些工具:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
5

然后转到 docs 目录,并运行:

STATE_ONLINE=1STATE_DRAFT=2STATE_OFFLINE=3STATE_CHOICES=((STATE_ONLINE,'Online'),(STATE_DRAFT,'Draft'),(STATE_OFFLINE,'Offline'),)STATE_DICT=dict(STATE_CHOICES)classContent(models.Model):title=models.CharField(max_length=255)content=models.TextField()state=models.PositiveSmallIntegerField(choices=STATE_CHOICES,default=STATE_DRAFT)def__unicode__(self):returnu'Content "%s" (state=%s)'%(self.title,STATE_DICT[self.state])print(Content.objects.filter(state=STATE_ONLINE))
6

作者

作者:Stephane"Twidi"Angel<; s Angel @ Twidi com >;( http://twidi.com ),最初为http://www.liberation.fr" rel="nofollow">http://www.liberationFR

bitdeli badge

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在不扩展小程序的情况下使用小程序方法?   Java/包含点的排序数组   java如何在EJB项目中创建会话?   java JavaFX我切换了场景,但我不能再回来了   环境变量为java设置类路径时%classpath%的含义是什么   java如何使用Serenity BDD管理浏览器选项卡?   java如何创建一个。gwt中的war文件在eclipse中使用maven?   java使用java程序更新HTML文件   Java、SQLite、向数据库插入数据   java无法在RPi上安装JDK 16   在不进行反射的情况下调用动态java方法   如何在Ubuntu上安装Eclipse和Java SDK?   JavaSSHMySQL连接   在内存和性能方面,用Java每秒打印格式化日期+时间的最有效方法是什么?   java如何匹配映射返回类型的键和值?   java JUnit测试挂起在clientSocket上。接受()?   jbossweb中的java系统属性引用。服务器启动时未解析xml   java如何在set操作中使用arrayUnion   java 安卓。看法充气异常:二进制XML文件行#22