python - AttributeError:“AttributeValueAdmin”对象没有属性“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 文档,第一步是通过子类化AttributeValue
表的内联类来显示中间模型,就像您所做的那样
class AttributeValueInline(admin.TabularInline):
model = models.AttributeValue
extra = 2
第二步是为模型Attribute
和ProductAttribute
模型创建管理视图。
class AttributeAdmin(admin.ModelAdmin):
inlines = (AttributeValueInline, )
prepopulated_fields = {'slug': ('name',), }
class ProductAttributeAdmin(admin.ModelAdmin):
inlines = (AttributeValueInline, )
第三步是注册你的Attribute
和ProductAttribute
模型
admin.site.register(models.Attribute, AttributeAdmin)
admin.site.register(models.ProductAttribute, ProductAttributeAdmin)
您不需要注册模型,因为您可以从其中一个或表AttributeValue
中创建/编辑内联。AttributeValue
Attribute
ProductAttribute
作为参考,您可以阅读 django 文档
推荐阅读
- angular - 带有订阅的 Angular Auth Guard
- python - Json 转换为 csv 文件但数据没有逐列跟随
- python - 如何为 CustomMessage_AdminCreateUser 触发器发送自定义消息?
- angular - 有没有办法在禁用 CSRF 的同时保留 Spring 默认登录页面?
- angular - SASS 无效的属性值
- javascript - 在 Angular 8 应用程序中获取选项配置的打字稿错误
- java - 同步访问相同文件,并发访问不同文件
- c++ - 循环多个枚举
- javascript - 删除多行文本区域文本每行“-”之前的所有字符
- python - 如何将多个csv文件合并为1个文件