django save_model () ошибка при создании нового объекта с полями m2m - PullRequest
2 голосов
/ 25 февраля 2012

У меня есть модель models.py:

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 ]

2 голосов
/ 25 февраля 2012
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
1 голос
/ 25 февраля 2012

Очень распространенная проблема. У вас нет объекта, поэтому вы не можете установить отношения m2m. Попробуйте использовать суперфункцию (извините, я не могу вспомнить, как ее правильно использовать, но вы легко найдете ее в документации), чтобы создать этот объект (ну, обработать чистую функцию перед изменениями), а затем изменить и сохранить.

...