Я действительно ненавижу шаблон. Однако я не могу отрицать, что такой код, как, например, следующий, является огромным преимуществом. Итак, мой вопрос, что делать в Python, чтобы компенсировать тот факт, что он не поставляется с предварительным процессором макроса (шаблона)?Как уменьшить шаблон шаблона на основе Django
Одна из идей - написать фабричную функцию, но я с готовностью признаю, что не знаю с чего начать. (Пожалуйста, обратите внимание, что это Django с его декларативными классами и интересными «волшебными» метаклассическими материалами, которые я знаю достаточно, чтобы распознать и не достаточно, чтобы понять или отладить, если я его сломаю).
Другой - это в шаблон и импортировать его через тривиальный предварительный процессор, который реализует что-то вроде ${var:-default}
в Bash. (См What is an alternative to execfile in Python 3?),
with my_preprocessor("somefile.py") as f:
code = compile(f.read(), "somefile.py", 'exec')
exec(code) # in the current namespace
Но есть много предупреждений о exec
, которые я видел на протяжении многих лет. В приведенном ответе SO упоминаются номера строк для отладки как проблемы. Тогда есть это, http://lucumr.pocoo.org/2011/2/1/exec-in-python/, предупреждение о тонких проблемах, в том числе утечки памяти. Я подозреваю, что они не будут применяться к коду, определяющему классы, которые «никогда» не удаляются, но, с другой стороны, я не хочу ни малейшего риска вводить неясные проблемы в настройку производства.
Любые мысли или указатели приветствуются. Лучше всего сделать, чтобы принять разрез и вставить шаблон? Вероятно, не будет более двадцати пастовых модификаций любого такого шаблона, обычно менее десяти.
Пример кода. Линии, отмеченные #V, являются единственными, которые обычно настраиваются. Первые два класса используются только один, третий.
#--- this is boilerplate for a select-view ----
#--- just replace the string "User" by the relevant model and customize
class UserSelectPopupTable(tables.Table):
id = SelectorColumn(clickme='<span class="glyphicon glyphicon-unchecked"></span>') #V
class Meta:
model=User
attrs={ 'class':'paleblue' }
empty_text='Sorry, that search did not match anything.'
fields=('name','address',) #V
sequence=('id','name','address',) #V
class UserFilter2(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='icontains') #V
address = django_filters.CharFilter(lookup_expr='icontains') #V
class Meta:
model = User
fields = ('name','address',) #V (usually same as previous)
class UserSelectPopup(FilterTableView):
model=User
table_class=UserSelectPopupTable
filterset_class=UserFilter2
template_name='redacted/select_in_popup.html'
#--- end boilerplate
Можете ли вы привести пример того, как вы хотите использовать эти сгенерированные классы? –
как виды: 'url (r '^ UserSelectPopup/$', views.UserSelectPopup.as_view(), name = 'userselectpopup'), ' – nigel222
Написание фабрики получилось намного проще, чем я думал. Я прочитал и перечитал «тип» 3-arg doc, а затем ... отвечу на собственный вопрос после немного большего тестирования и убора. – nigel222