2011-12-12 60 views
4

我有一個相當簡單的Django應用程序(紅帽v1.3),我使用管理應用程序創建和修改數據庫記錄。我的基礎模型中的一個字段是日期字段。每次在管理員的新建或編輯表單中顯示相應的字段時,我都希望該字段的初始值爲今天的日期(和時間)。如果她願意,用戶可以選擇修改它。在綁定的Django管理員表單中分配初始字段值

我知道我可以在我的模型定義(即在models.py中)內設置默認字段值。當數據庫記錄首次創建時,它可以正常工作。但是對於後續的更改形式的調用,我分配給默​​認參數(datetime.datetime.now)的可調用顯然不會被調用。

我已經看過 - 並嘗試過 - 非常好的所有提議的解決方案,其他地方在stackoverflow中描述,沒有成功。它們中的大多數似乎圍繞將初始化代碼插入到ModelForm子類中,例如無論是像這樣...

class ConstantDefAdminForm(ModelForm) : 
    a_date_field = DateField(initial="datetime.datetime.now") # or now() 
    class Meta : 
     model = ConstantDef 
     widgets = { 
      ... 
     } 

或類似這樣的東西...

class ConstantDefAdminForm(ModelForm) : 
    class Meta : 
     model = ConstantDef 
     widgets = { 
      ... 
    } 
    def __init__(self, ...) : 
     # some initialisation of a_date_field 
     super(ConstantDefAdminForm, self).__init__(...) 

但這些都不能工作。初始字段值始終設置爲存儲在數據庫中的值。我對Django文檔的閱讀是,在表單中施加初始字段值的各種方式僅適用於未綁定的表單,而不是綁定的表單。對?

但是,這種能力(有選擇地覆蓋當前存儲的值)似乎是如此受歡迎的要求,我相信必須有一種方法來做到這一點。

有沒有人有成功做到這一點?

由於提前,

菲爾

回答

4

以下是可能有效的方法。在您的模型管理員類中,在表單綁定之前更改值​​3210。日期字段的「默認」值應該是新值。

class MyModelAdmin(ModelAdmin): 
    ... 
    def get_object(self, request, object_id): 
     obj = super(MyModelAdmin, self).get_object(request, object_id) 
     if obj is not None: 
      obj.a_date_field = datetime.now() 
     return obj 

注意get_object沒有記載,所以這是一個有點哈克。

+0

酷!這似乎是訣竅。不知道可能有什麼副作用。但我想我會在適當的時候發現:-)非常感謝。 – Phil

0

應該能夠將每個窗體保存時間使用auto_now與DateTime字段這according to the docs會自動將該值設置爲NOW()

+1

嗨布蘭登。謝謝你的提示。我以前沒有發現這些日期欄位選項。不幸的是,他們並沒有這麼做,因爲正如文檔中提到的那樣,當應用auto_now/auto_now_add選項時,該字段將呈現爲不可編輯狀態。這意味着該字段不會以任何管理員的形式出現(儘管看起來這可以通過將字段設置爲只讀而部分得到解決 - 而不是這對於最終用戶非常有用!)。 – Phil

1

我也有類似的問題,我發現從here

我想你會想做什麼解決的辦法是這樣的:

class yourAdminModel(admin.ModelAdmin): 

    fields = ['your_date_field'] 

    def add_view(self, request, form_url="", extra_context=None): 
     data = request.GET.copy() 
     data['your_date_field'] = datetime.date.today() # or whatever u need 
     request.GET = data 
     return super(yourAdminModel, self).add_view(request, form_url="", extra_context=extra_context) 
4

在Django的1.4 default=<callable>模型的申報工作得很好:

class MyModel(models.Model): 
    dt = models.TimeField(null=True, blank=True, default=datetime.datetime.now) 

每次添加記錄時字段的默認值都會更新。

但是,使用該字段的default參數會導致DateField對象的管理日誌歷史記錄出現問題,並且每次記錄時也會在未修改時記錄爲已更改。所以我採用了基於https://stackoverflow.com/a/11145346/1838607一個解決方案:

import datetime 

class MyModelAdminForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(MyModelAdminForm, self).__init__(*args, **kwargs) 

     self.fields['dt'].initial = datetime.datetime.now 

class MyModelAdmin(admin.ModelAdmin): 
    form = MyModelAdminForm 
    fields = ('dt',) 
0

由於Django的1.7存在的ModelAdmin功能get_changeform_initial_data,設置初始表單值:

def get_changeform_initial_data(self, request): 
    return {'dt': datetime.now()} 
相關問題