3

我一直试图通过继承它并重写BaseModelAdmin类中的一些方法来使GenericTabularInline类在双管理双数据库设置中工作,就像在Django文档(https ://docs.djangoproject.com/en/dev/topics/db/multi-db/),但是如果一个子模型以内联形式编辑,它总是写入默认数据库(我希望第二个管理员处理专门用于辅助数据库,两者的模型是相同的),所以我不能重写某些方法或做错某些事情。这里是我到目前为止的班级:多个数据库的Django GenericTabularInline

class MultiDBGenericTabularInline(generic.GenericTabularInline): 

    using = settings.SECONDARY_DATABASE 

    def save_model(self, request, obj, form, change): 
     # Tell Django to save objects to the 'other' database. 
     obj.save(using=self.using) 

    def delete_model(self, request, obj): 
     # Tell Django to delete objects from the 'other' database 
     obj.delete(using=self.using) 

    def queryset(self, request): 
     # Tell Django to look for objects on the 'other' database. 
     return super(MultiDBGenericTabularInline, self).queryset(request).using(self.using) 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     # Tell Django to populate ForeignKey widgets using a query 
     # on the 'other' database. 
     return super(MultiDBGenericTabularInline, self).formfield_for_foreignkey(db_field, request=request, using=self.using, **kwargs) 

    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
     # Tell Django to populate ManyToMany widgets using a query 
     # on the 'other' database. 
     return super(MultiDBGenericTabularInline, self).formfield_for_manytomany(db_field, request=request, using=self.using, **kwargs) 

    #Override these three methods; otherwise the log manager attempts 
    #to write to the main db and raises an exception. 

    def log_addition(self, request, object): 
     pass 

    def log_change(self, request, object, message): 
     pass 

    def log_deletion(self, request, object, object_repr): 
     pass 

任何帮助或暗示赞赏。

回答

0

我意识到这是一个古老的问题,但最近我偶然发现了一个非常类似的东西。诀窍是重写父级模型管理员的方法save_formset。在我的情况下,解决的办法是做这样的事情:

class SomeTabularInline(admin.TabularInline): 
    # stuff 


class MyModelAdmin(admin.ModelAdmin): 
    using = 'something' 
    inlines = (SomeTabularInline,) 

    def save_formset(self, request, form, formset, change): 
     instances = formset.save(commit=False) 
     for obj in formset.deleted_objects: 
      obj.delete(using=self.using) 
     for instance in instances: 
      instance.save(using=self.using) 
     formset.save_m2m() 

注:我使用的是TabularInline实例,而不是一个GenericTabularInline但他们都从InlineModelAdmin下降;所以我希望这会适用于你的情况。

来源:https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset