2011-07-23 125 views
2

其實我試圖在我的表單中添加一個外鍵字段,就像它在django管理站點中發生的一樣。當你點擊綠色的「+」按鈕時,它會打開一個新的彈出窗口,在其中添加相應的字段。如何在django管理站點添加forreign關鍵字段?

我的模型是這樣的:

class DealType(models.Model): 
    label = models.CharField(max_length = 100) 
    def __unicode__(self): 
     return self.label  


class Deal(models.Model): 
    label = models.ForeignKey(DealType, blank = True, null = True) 
    . 
    . 
    . 

,我想補充交易類型,而我填寫了我的DealForm。

回答

2

我認爲你必須創建一個單獨的視圖來創建DealType。

在你的DealForm中添加一個鏈接來打開該視圖。

...

我看了一下我的一個項目的管理頁面。

HTML

<a href="/admin/portfolio/category/add/" class="add-another" id="add_id_category" onclick="return showAddAnotherPopup(this);"> <img src="/static/admin/img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/> </a> 

的Javascript

<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js"> </script> 

function showAddAnotherPopup(triggeringLink) { 
    var name = triggeringLink.id.replace(/^add_/, ''); 
    name = id_to_windowname(name); 
    href = triggeringLink.href 
    if (href.indexOf('?') == -1) { 
     href += '?_popup=1'; 
    } else { 
     href += '&_popup=1'; 
    } 
    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); 
    win.focus(); 
    return false; 
} 

採取這將打開與添加表單視圖的新窗口。

這種觀點應該添加的交易類型,然後使用下面的函數中這是剛剛從管理面板回溯同一個JavaScript文件

function dismissAddAnotherPopup(win, newId, newRepr) { 
    // newId and newRepr are expected to have previously been escaped by 
    // django.utils.html.escape. 
    newId = html_unescape(newId); 
    newRepr = html_unescape(newRepr); 
    var name = windowname_to_id(win.name); 
    var elem = document.getElementById(name); 
    if (elem) { 
     if (elem.nodeName == 'SELECT') { 
      var o = new Option(newRepr, newId); 
      elem.options[elem.options.length] = o; 
      o.selected = true; 
     } else if (elem.nodeName == 'INPUT') { 
      if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { 
       elem.value += ',' + newId; 
      } else { 
       elem.value = newId; 
      } 
     } 
    } else { 
     var toId = name + "_to"; 
     elem = document.getElementById(toId); 
     var o = new Option(newRepr, newId); 
     SelectBox.add_to_cache(toId, o); 
     SelectBox.redisplay(toId); 
    } 
    win.close(); 
} 

還發現關閉該窗口,但它應該讓你開始。

...

研究發現,引導您完成整個過程here這或許可以解釋很多更好的指導。 (沒有看過)

相關問題