2009-11-24 65 views
0

我想知道如何更改模型的字段參數,而不是在模型初始化期間,而是從模型管理員。舉例來說,我願作任何領域的「富」或「 - 」可選,根據上一個get參數(想了解的#僞代碼位正確的解決方案):Django:從管理視圖中更改模型字段

def add_view(self, request, form_url='', extra_context=None): 
    if request.GET.get('object_type', 'foo') == 'foo': 
     # PSEUDO CODE: 
     model.fields.foo.blank = False 
     model.fields.bar.blank = True 
    else: 
     # PSEUDO CODE: 
     model.fields.foo.blank = True 
     model.fields.bar.blank = False 
    return super(FileNodeAdmin, self).add_view(request, form_url, extra_context) 

回答

1

您可能會遇到因爲許多字段的屬性都是在數據庫級別表示的(例如,如果您執行的manage.py syncdb字段的值爲null=False,則創建數據庫字段的DDL將具有NOT NULL)。動態地改變數據庫約束的行爲幾乎是不可能的。

我最喜歡處理你所描述的方法應該是在表格級別而不是在模型級別。我的模型是通用的並且允許所有允許的狀態(例如,如果在某些情況下某個字段可以爲空,但不是其他情況,只需設置null=True)。然後我會動態地改變一個django.form實例來改變它的驗證方式,或者只是在我的視圖中手動進行驗證。你甚至可能需要一個表單實例,每個實例都有稍微不同的約束,並根據你的GET決定使用哪一個。在僞代碼中:

def view(request): 
    if request.GET.get('object_type', 'foo') == 'foo': 
     f = FooForm(request) # FooForm let's bar be blank, while foo can not be blank 
     if f.is_valid(): 
      a = f.cleaned_data['a'] 
      ... 
    else: 
     f = BarForm(request) # BarForm let's foo be blank, while bar can not be blank 
     if f.is_valid(): 
      a = f.cleaned_data['a'] 
相關問題