【发布时间】:2013-08-31 19:53:35
【问题描述】:
(编辑:我得到了很多关于实现的答案(我很感激),但我更关心的是规范语法。这个的用户插件(即 Python/Django 开发人员 - 不是网站用户)将需要以我正在发明的语法指定条件。所以重新表述这个问题......在编写模型或表单类时...... .原型 Python/Django 开发人员更喜欢以下哪种语法来指定表单字段的条件显示逻辑?)
我正在寻找一些关于最 Pythonic(可读、直接等)方式的建议,以指定比较运算符以供以后在比较中使用(通过 javascript 执行)。类似的东西(这只是我想到的一个例子——还有很多其他可能的格式):
comparisons = (('a', '>', 'b'), ('b', '==', 'c'))
稍后将在 Javascript 中进行评估。
上下文是我正在开发一个 Django 应用程序(最终作为插件分发),这将要求用户以我选择的任何语法编写比较(因此有关使其成为 Pythonic 的问题)。比较将引用表单字段,并最终转换为 javascript 条件表单显示。我想一个例子是为了:
class MyModel(models.Model):
yes_or_no = models.SomeField...choices are yes or no...
why = models.SomeField...text, but only relevant if yes_or_no == yes...
elaborate_even_more = models.SomeField...more text, just here so we can have multiple conditions
#here i am inventing some syntax...open to suggestions!!
why.show_if = ('yes_or_no','==','yes')
elaborate_even_more.show_if = (('yes_or_no','==','yes'),('why','is not','None'))
#(EDIT - help me choose a syntax that is Pythonic and...Djangonic...and that makes your fingers happy to type!)
#another alternative...
conditions = {'why': ('yes_or_no','==','yes'),
'elaborate_even_more': (('yes_or_no','==','yes'),('why','is not','None'))
}
#or another alternative...
"""Showe the field whiche hath the name *why* only under that circumstance
in whiche the field whiche hath the name *yes_or_no* hath the value *yes*,
in strictest equality."""
etc...
(挥手......使用model_form_factory()将MyModel转换为ModelForm......在字典中收集所有“field.show_if”条件并作为MyModelForm.conditions或其他东西附加到ModelForm......)
现在在模板中的一段 javascript 中,MyModelForm.condtions 中的每个条件都将成为一个函数,用于侦听字段值的变化,并显示或隐藏另一个字段作为响应。基本上(在伪 Javascript/Jquery 中):
when yes_or_no changes...
if (yes_or_no.value == 'yes'){
$('#div that contains *why* field).show(); }
else {
$('#div that contains *why* field).hide(); }
这里的目标是让最终用户以直接的 Python 方式在模型定义中指定条件显示逻辑在模型定义中(可能有一个选项可以在表单类上指定条件,我认为这更像是“Djangonic”(??),但对于我的用例,它们需要进入模型)。然后我的幕后插件将其转换为模板中的 Javascript。因此,您无需编写任何 Javascript 即可获得条件表单显示。由于这将掌握在 python/django 开发人员手中,因此我正在寻找有关指定这些条件的最原生、最舒适的方法的建议。
【问题讨论】:
-
如果您的问题是询问如何设计您的 API(而不是如何实现 API),也许您应该前往programmers.stackexchange.com。 StackOverflow 旨在为您提供如何实现事物的答案:API 设计有点主观,在程序员堆栈交换上可能会更好。
-
谢谢马克,我不知道这种区别。有没有一种方法可以在不复制的情况下迁移它,或者我应该在那里发布一个问题并链接到这个?
-
好吧,老实说,即使在那里,您也可能会发现问题已经结束。这是非常主观的:“您希望如何设计这个 API?”
-
当然,这是主观的,正如“好代码”(或“pythonic 代码”)的原因。也许它会更好地表述为“这就是我打算如何设计这个 API;这是否符合规范和约定,以便 python/django 社区中的人易于阅读和编写?”