繁体   English   中英

AttributeError: 'AttributeValueAdmin' object 没有属性 'urls'

[英]AttributeError: 'AttributeValueAdmin' object has no attribute 'urls'

我为属性和产品属性设计了一个表格。 一个属性可以有多个值。 例如,一个名为颜色的属性可以有黑色、白色、灰色、栗色等值。为此,我设计了一个表格

但是,在向管理员注册时,我收到AttributeError: 'AttributeValueAdmin' object has no attribute 'urls'错误。

class Attribute(models.Model):
    name = models.CharField(max_length=30, unique=True)
    slug = models.SlugField(max_length=250, unique=True)

    class Meta:
        verbose_name = "Attribute"
        verbose_name_plural = "Attributes"

    def __str__(self):
        return self.name


class ProductAttribute(SortableModel):
    product = models.ForeignKey(Product,
                                related_name="productattribute",
                                null=True,
                                on_delete=models.CASCADE)
    attribute = models.ManyToManyField(
        Attribute,
        through="AttributeValue"
    )

    class Meta:
        ordering = ("sort_order",)
        verbose_name = "Product Attribute"
        verbose_name_plural = "Product Attributes"



class AttributeValue(SortableModel):
    name = models.CharField(max_length=250)
    value = models.CharField(max_length=100, blank=True, default="")
    slug = models.SlugField(max_length=255)
    productattribute = models.ForeignKey(ProductAttribute,
                                         null=True,
                                         related_name='productattribute',
                                         on_delete=models.CASCADE)
    attribute = models.ForeignKey(
        Attribute, related_name="values", on_delete=models.CASCADE
    )

    class Meta:
        ordering = ("sort_order", "id")
        unique_together = ("slug", "attribute")

    def __str__(self) -> str:
        return self.name

管理员.py

class ProductAdmin(admin.ModelAdmin):
    model = models.Product
    prepopulated_fields = {'slug': ('name',), }


class AttributeValueAdmin(admin.TabularInline):
    model = models.AttributeValue
    extra = 2


class AttributeAdmin(admin.ModelAdmin):
    model = models.Attribute
    prepopulated_fields = {'slug': ('name',), }


class ProductAttributeAdmin(admin.ModelAdmin):
    # model = models.ProductAttribute
    inlines = (AttributeValueAdmin, )


admin.site.register(models.Attribute, AttributeAdmin)
admin.site.register(models.AttributeValue, AttributeValueAdmin)
admin.site.register(models.ProductAttribute, ProductAttributeAdmin)

根据管理员上的 django 文档,第一步是通过子类化内联 class 来显示中间AttributeValue

class AttributeValueInline(admin.TabularInline):
    model = models.AttributeValue
    extra = 2

第二步是为AttributeProductAttribute模型创建管理视图。

class AttributeAdmin(admin.ModelAdmin):
    inlines = (AttributeValueInline, )
    prepopulated_fields = {'slug': ('name',), }


class ProductAttributeAdmin(admin.ModelAdmin):
    inlines = (AttributeValueInline, )

第三步是注册你的AttributeProductAttribute模型

admin.site.register(models.Attribute, AttributeAdmin)
admin.site.register(models.ProductAttribute, ProductAttributeAdmin)

您不需要注册AttributeValue model,因为您可以从AttributeProductAttribute表中创建/编辑AttributeValue内联。

作为参考,您可以阅读 django 文档

https://docs.djangoproject.com/en/3.0/ref/contrib/admin/#working-with-many-to-many-intermediary-models

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM