2012-04-18 42 views
1

在Django的管理員中,我已經看到如何使用GET變量設置'add object'表單的字段(例如/admin/app/model/add?title=lol將'Title'字段設置爲'lol')。Django admin:如何從GET變量填充新對象?

但是,我希望能夠沿着/admin/app/model/add?key=18的方向行事,並從另一個模型的實例爲我的字段加載默認數據。理想情況下,我也希望能夠對填充表單的值進行一些處理。我該怎麼做呢?

回答

4

我設法弄明白了。覆蓋整個add_view方法似乎對我來說太複雜了。謝天謝地,Django允許你替換requestGET字典(它用於預先填充管理表單)。以下爲我工作:

class ArticleAdmin(admin.ModelAdmin): 
    // ... 

    def add_view(self, request, form_url='', extra_context=None): 
     source_id = request.GET.get('source',None) 
     if source_id != None: 
      source = FeedPost.objects.get(id=source_id) 
      // any extra processing can go here... 
      g = request.GET.copy() 
      g.update({ 
       'title':source.title, 
       'contents':source.description + u"... \n\n[" + source.url + "]", 
      }) 

      request.GET = g 

     return super(ArticleAdmin, self).add_view(request, form_url, extra_context) 

這樣,我獲得的URL參數的「源」對象,加載我從它需要的值,做什麼,我想和他們,和預填充形成。

+0

這非常有幫助! – abidibo 2016-02-03 13:57:17

2

您可以覆蓋ModelAdmin實例的方法add_view。添加獲取對象,將對象的pk設置爲None,並將該對象作爲instance提供給表單。帶有pk == None的對象將始終作爲表格中的數據庫中的新對象插入save()

+0

我不確定你的意思。我玩過add_view;然而,超級方法返回一個呈現的形式,我不知道如何預先填充它。 – egasimus 2012-04-19 13:59:30

+1

不要使用超級方法。只需更改[表單創建](https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L936),以便它可以獲取並使用一個對象作爲「初始」。你也可以重寫'get_form'並創建一個內置正確的'instance'的表單類,它會更幹,但也更復雜的代碼。 – ilvar 2012-04-19 15:24:54