我真的很討厭樣板文件。但是,我不能否認像下面這樣的代碼是一個巨大的好處。所以我的問題是,在Python中做了什麼來彌補它不具有宏(模板)預處理器的事實?如何減少基於Django類的視圖樣板文件
一個想法是編寫一個工廠函數,但我會自願承認我不知道從哪裏開始。 (請注意,這是Django及其聲明性類和有趣的「魔術」metaclassy的東西在下面,我知道足夠的認識,並不足以理解或調試,如果我打破它)
另一個將轉這成爲一個模板,並通過在Bash中實現類似${var:-default}
的簡單預處理器導入它。 (見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
警告,我已經看到多年來的。引用的答案提到了用於調試的行號作爲一個問題。然後是這個,http://lucumr.pocoo.org/2011/2/1/exec-in-python/,包括內存泄漏在內的細微問題的警告。我懷疑他們不會適用於定義「永不」被刪除的類的代碼,但另一方面,我不希望在生產環境中引入模糊問題。
任何想法或指針歡迎。最好的做法是接受剪切和粘貼樣板文件?任何這樣的模板都不可能有超過20次的粘貼修改,通常少於10次。
示例代碼。標有#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
你能舉一個你想如何使用這些生成的類的例子嗎? –
as views:'url(r'^ UserSelectPopup/$',views.UserSelectPopup。as_view(),name ='userselectpopup'),' – nigel222
寫一個工廠比我想象的要容易得多。我閱讀並重新閱讀'type' 3-arg文檔,然後......將在更多測試和整理之後回答自己的問題。 – nigel222