2012-12-21 124 views
1

我想額外參數model.Field基類添加到 以後使用沒有FormModelForm類定義再次領域的額外選擇額外的參數。Django的,對於模型字段定義

而且我可以添加額外的參數:

(InteractiveConsole) 
>>> from polls.models import Poll 
>>> Poll._meta.fields[1].extra 
{'widget': 'xw', 'admin_list_order': 3} 
>>> 

這是適當的,Python化的方式來增加一個額外的參數:

class Poll(models.Model): 

    question = models.CharField(max_length=200, 
           extra= { 'widget': 'xw', 
             'admin_list_order': 3 }) 

    pub_date = models.DateTimeField('date published') 

我可以訪問額外的ARG?

from django.db import models 

# save old __init__ function of Field class 
__oInit = models.Field.__init__ 

# define a new one to accept 'extra' arg 
def __xinit__(self, *args, **kwargs): 

    #chek if extra arg exist 
    if kwargs.has_key('extra'): 
     self.extra = kwargs.pop('extra') 

    #call real __init__ 
    __oInit(self, *args, **kwargs) 

# replace init with new one 
models.Field.__init__ = __xinit__ 

回答

1

如果他們向字段中添加extra參數,這可能會中斷。一般來說,勸阻和。您可以通過添加一個方法到Field基類去一個更安全的路線:

def set_extra(self, **kwargs): 
    self.extra = kwargs 
    return self 
models.Field.set_extra = set_extra 

然後這樣定義你的模型:

class Poll(models.Model): 
    question = models.CharField(max_length=200).set_extra(
      widget='xw', admin_list_order=3) 

has_key被認爲unpythonic,首選方法檢查關鍵存在是:

if 'extra' in kwargs: 
    self.extra = kwargs.pop('extra') 

更多Python的將只是嘗試它和捕獲失敗:

try: 
    self.extra = kwargs.pop('extra') 
except KeyError: 
    pass 
+0

非常感謝你。我得到了我所要求的。
另外感謝額外的技巧檢查額外的參數。 – firatto

相關問題