2012-02-25 49 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