<p>好吧。我已经想出了一个在这里有效的解决方案,我将把它提供给任何其他有同样需求的人。在</p>
<pre><code>from django.forms.widgets import Select
import re
class CustomOrderingWidget(Select):
def __init__(self, priority_regex, sort='+', attrs=None):
super(CustomOrderingWidget, self).__init__(attrs)
self.regex = re.compile(priority_regex)
self.sort = sort
self.template_name = 'django/forms/widgets/select.html'
def render(self, name, value, attrs=None, renderer=None):
context = self.get_context(name, value, attrs)
optgroups = context.get('widget').get('optgroups')
firsts, others = [], []
for grp in optgroups:
if self.regex.search(grp[1][0].get('label')):
firsts.append(grp)
else:
others.append(grp)
if self.sort == '+':
kfn = lambda x: x[1][0].get('label')
context['widget']['optgroups'] = sorted(firsts, key=kfn) +\
sorted(others, key=kfn)
elif self.sort == '-':
kfn = lambda x: x[1][0].get('label')
context['widget']['optgroups'] =\
sorted(firsts, key=kfn, reverse=True) +\
sorted(others, key=kfn, reverse=True)
else:
context['widget']['optgroups'] = firsts + others
return self._render(self.template_name, context, renderer)
</code></pre>
<p>然后你可以把它插入这样的模型表单。。。在</p>
^{pr2}$