(编辑:我得到了很多关于实现的答案(我很感激),但我更关心的是规范语法。这个插件的用户(即 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(); }
这里的目标是让最终用户在模型定义中以一种直接的、pythonic 的方式指定条件显示逻辑(可能有一个选项可以在表单类上指定条件,我认为这更像是“Djangonic”(? ?),但对于我的用例,他们需要进入模型)。然后我的幕后插件将其转换为模板中的 Javascript。因此,您无需编写任何 Javascript 即可获得条件表单显示。由于这将掌握在 python/django 开发人员手中,因此我正在寻找有关指定这些条件的最原生、最舒适的方法的建议。