2012-02-25 56 views
2

我有一個模型models.py一個新的對象:Django的save_model()錯誤創建與M2M領域

class MyModelClass(models.Model): 
    name = models.CharField(max_length=255) 
    m2m_1 = models.ManyToManyField(A, blank=True, null=True)  
    m2m_2 = models.ManyToManyField(B, blank=True, null=True) 
    fk = models.ForeignKey('C') 
    int = models.IntegerField() 

admin.py類:

class MyModelClassAdmin(admin.ModelAdmin): 
    list_display = ('name',) 

    #Get all fields selected in MyModelClass m2m_2 
    def get_selected_in_m2m_2(self, obj): 
     sel = obj.m2m_2.all() #This line is the one for i get an error. The error is described below. 
     return sel 

    def save_model(self, request, obj, form, change): 
     """When creating a new object, set the creator field. 
     """ 
     m2m_2_selected = self.get_selected_in_m2m_2(obj) 
     print m2m_2_selected 

     print request.user 
     if not change: 
      obj.creator = request.user 
     obj.save() 


問題:
一切正常,如果我點擊已保存的現有的 MyModelClass的對象在我的管理頁面上的「保存」按鈕。
但是,如果我嘗試創建在管理頁面的新模式對象,然後單擊「保存」按鈕(保存一個新的對象,而不是更新現有的),我會得到一個錯誤:'MyModelClass' instance needs to have a primary key value before a many-to-many relationship can be used.

對不起,我的英文。
任何幫助表示讚賞。
謝謝。

回答

2
def save_model(self, request, obj, form, change): 
    """When creating a new object, set the creator field. 
    """ 
    if not change: 
     obj.creator = request.user 

    super(MyModelClassAdmin, self).save_model(request, obj, form, change) 

    m2m_2_selected = self.get_selected_in_m2m_2(obj) 
    print m2m_2_selected 
    print request.user 
+0

仍然是同樣的問題 – ted 2012-02-25 12:24:31

+0

修改了代碼,現在就試試吧。 – 2012-02-25 12:26:41

+0

無懈可擊,謝謝 – ted 2012-02-25 12:37:18

1

很常見的問題。你沒有對象,所以你不能設置m2m關係。嘗試使用超級函數(對不起,不記得它的正確用法,但你會很容易地在文檔中找到它)來創建這個對象(以及在chages之前處理純函數),然後修改它並保存。

+0

Upvoted,因爲你是第一個說使用super()函數,保存和編輯。謝謝 – ted 2012-02-25 12:38:36