Django - перенаправление на страницу администрирования подкласса - PullRequest
0 голосов
/ 26 июня 2018

Я создаю веб-приложение с Django.

В моем models.py у меня есть класс BaseProduct и класс DetailProduct, который расширяет BaseProduct.

В моем admin.py у меня есть класс BaseProductAdmin и класс DetailProductAdmin, который расширяет BaseProductAdmin.

У меня есть другой класс, называемый System, имеющий отношение многие ко многим с BaseProduct.

На странице системного администратора я могу визуализировать список объектов BaseProduct, связанных с этой системой.

Когда я нажимаю на продукт, приложение перенаправляет меня на страницу администрирования BaseProduct.

Когда продукт списка является объектом DetailProduct, я бы хотел перенаправить его на страницу администрирования DetailProduct.

Есть идеи, как это сделать?

В models.py:

class BaseProduct(models.Model):
    id = models.AutoField(primary_key=True, db_column='ID')
   _prod_type_id = models.ForeignKey(
    ProductTypes, verbose_name="product type", db_column='_prod_type_ID')  
    systems = models.ManyToManyField(
    'database.System', through='database.SystemProduct')

    def connected_to_system(self):
        return self.systems.exists()

    class Meta:
        db_table = u'products'
        verbose_name = "Product"
        ordering = ['id', ]


class System(models.Model):
    id = models.AutoField(primary_key=True, db_column='ID')
    name = models.CharField(max_length=300)

    def has_related_products(self):
        """ Returns True if the system is connected with products. """
        return self.products_set.exists()

    class Meta:
        managed = False
        db_table = u'systems'
        verbose_name = "System"
        ordering = ['id', ]


class DetailProduct(BaseProduct):
    options_id = models.AutoField(db_column='ID', primary_key=True)
    product = models.OneToOneField(BaseProduct, db_column='_product_ID',    parent_link=True)
    min_height = models.FloatField(help_text="Minimum height in meters.")
    max_height = models.FloatField(help_text="Maximum height in meters.")

    def __init__(self, *args, **kwargs):
        super(DetailProduct, self).__init__(*args, **kwargs)
        if not self.pk:
            self._prod_type_id = ProductTypes.objects.get(pk=9)

    class Meta:
        managed = False
        db_table = 'detail_product'
        verbose_name = "Detail product"
        verbose_name_plural = "Detail products"


class SystemProduct(models.Model):
    id = models.AutoField(primary_key=True, db_column='ID')
    _system_id = models.ForeignKey(System, db_column='_system_ID')
    _product_id = models.ForeignKey(BaseProduct, db_column='_Product_ID')

    class Meta:
        db_table = u'system_product'
        unique_together = ('_system_id', '_product_id')
        verbose_name = "system/product connection"

На моей странице admin.py:

class SystemProductInlineGeneric(admin.TabularInline):
    model = SystemProduct
    extra = 0
    show_edit_link = True
    show_url = True


class SystemProductForm(forms.ModelForm):
    class Meta:
        model = SystemProduct
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        """ Remove the blank option for the inlines. If the user wants to remove
        the inline should use the proper delete button. In this way we can
        safely check for orphan entries. """

        super(SystemProductForm, self).__init__(*args, **kwargs)

        modelchoicefields = [field for field_name, field in self.fields.iteritems() if
                         isinstance(field, forms.ModelChoiceField)]

        for field in modelchoicefields:
            field.empty_label = None


class SystemProductInlineForSystem(SystemProductInlineGeneric):
        """ Custom inline, used under the System change page. Prevents all product-system
        connections to be deleted from a product. """
        form = SystemProductForm
        raw_id_fields = ("_product_id",)

class SystemAdmin(admin.ModelAdmin):
    inlines = [SystemProductInlineForSystem]
    actions = None
    list_display = ('id', 'name')
    fieldsets = [('System information', 
         {'fields': (('id', 'name',), ),}),
    ]
    list_display_links = ('id', 'configuration',)
    readonly_fields = ('id',)

    save_as = True

1 Ответ

0 голосов
/ 26 июня 2018

Если я правильно понимаю, ваш вопрос заключается в том, как изменить шаблон InlineAdmin (SystemProductInlineForSystem), чтобы «ссылка изменения» перенаправляла на форму DetailProduct изменения администратора (вместо формы BaseProduct изменения администратора), когдапродукт на самом деле DetailProduct.

Мне никогда не приходилось иметь дело с этим вариантом использования, поэтому я не могу дать исчерпывающий окончательный ответ, но в основном вам придется переопределить шаблон inlineadmin для SystemProductInlineForSystem и измените часть кода, которая генерирует этот URL .

Я не могу точно сказать, какие изменения вам придется внести (ну, я бы, наверное, мог, если бы у меня было на это пару часов, но это не так) ... так что вы будетенужно проанализировать эту часть кода и выяснить это самостоятельно - если, конечно, кто-то более знающий не перезвонит ...

...