【问题标题】:Django GenericTabularInline for multiple databases用于多个数据库的 Django GenericTabularInline
【发布时间】:2012-09-04 11:39:16
【问题描述】:

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

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

感谢任何帮助或提示。

【问题讨论】:

    标签: django django-admin inline-editing inline-formset generic-foreign-key


    【解决方案1】:

    我意识到这是一个老问题,但我最近偶然发现了一个非常相似的事情。诀窍是覆盖父模型管理员的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

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2019-10-11
      • 2013-04-26
      • 2011-12-29
      • 2019-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多