【问题标题】:How to Dislay Relation value in Django?如何在 Django 中显示相对值?
【发布时间】:2020-11-09 17:06:30
【问题描述】:

我正在使用 Django 管理面板,并且正在为电子商务网站的产品变体进行设置,我在我的数据库中为变体创建了多个表,这些表彼此相关。现在我想在管理面板中显示sizeflavour,假设有3种尺寸smallmediumlarge那么它应该显示在我的Django管理面板的Size下拉列表中, 和 flavours 的相同过程,但现在所有 sizes 和 `flavors 都在一个下拉列表中,请检查我的代码,让我知道如何解决这个问题。

这是我的models.py 文件

class Variants(models.Model):
    name=models.CharField(max_length=285, default=None)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

这里是变体选项代码,它将存储variation table id

class VariantOptions(models.Model):
    variant=models.ForeignKey('Variants', related_name='var_option', on_delete=models.CASCADE, null=True, blank=True)
    name=models.CharField(max_length=285)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

这是我的skuoption 表格代码

class SkuOption(models.Model):
    product = models.ForeignKey('Product', null=True, blank=True, on_delete=models.CASCADE)
    variantoption=models.ForeignKey('VariantOptions', related_name='sku_option', on_delete=models.CASCADE, null=True, blank=True)
    sku=models.CharField(max_length=285, null=True, blank=True)
    price=models.CharField(max_length=285, null=True, blank=True)
    qty=models.CharField(max_length=285, null=True, blank=True)
    created_at=models.DateTimeField(auto_now_add=True)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.sku

这是我的admin.py 文件代码,我在其中为关系注册模型

class SkuOptionAdmin(admin.TabularInline):
    fieldsets = [(None, {'fields':['sku','price','qty','variantoption']})]
    model = SkuOption

这是我的管理面板图片

我所有的variationoption 都在单个下拉列表中,但我希望sizeflavour 不同,并且会有2 个下拉列表,一个用于size,另一个用于flavour,以及这些选项将来自variantvariantoption 表,所以请让我知道我可以在fieldsets = [(None, {'fields':['sku','price', 'qty','variantoption']})] 的 admin.py 文件中执行哪些代码,这样我就可以获得两个下拉列表。 如果您有新的建议,请与我分享。

【问题讨论】:

    标签: django django-models django-views django-templates django-admin


    【解决方案1】:

    将变量外键添加到 skuoption 表,而不是变量选项表:

    class VariantOptions(models.Model):
      name=models.CharField(max_length=285)
      created_at=models.DateTimeField(auto_now_add=True)
      updated_at=models.DateTimeField(auto_now=True)
    
      def __str__(self):
          return self.name
    
    
    class SkuOption(models.Model):
        product = models.ForeignKey('Product', null=True, blank=True, on_delete=models.CASCADE)
        variant=models.ForeignKey('Variants', related_name='var_option', on_delete=models.CASCADE, null=True, blank=True)
        variantoption=models.ForeignKey('VariantOptions', related_name='sku_option', on_delete=models.CASCADE, null=True, blank=True)
        sku=models.CharField(max_length=285, null=True, blank=True)
        price=models.CharField(max_length=285, null=True, blank=True)
        qty=models.CharField(max_length=285, null=True, blank=True)
        created_at=models.DateTimeField(auto_now_add=True)
        updated_at=models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.sku
    

    【讨论】:

    • 它给了我variants表格数据'sizeflavour,但我想要variantoption根据variant_id在下拉列表中的表格数据,请看上图,那里是variant_id=1 那么所有sizes 都应该在我的管理面板中的新下拉列表中,如果vriant_id=2 那么所有flavour 都应该在我的管理面板中的新下拉列表中。
    【解决方案2】:

    如果您希望您的属性和属性值是动态的,为了获得不同的大小(属性)和风味(值),我建议您创建一个包含产品、属性和外键的表,如下所示:

      class Attributes(models.Model):
        name = models.CharField(max_length=50, default=None)
        slug = models.SlugField(max_length=200, unique=True,null=True)
    
    class AttributeTerms(models.Model):
        name = models.CharField(max_length=50, blank =True)
        attribute = models.ForeignKey(Attributes, on_delete=models.CASCADE)  
    
    class Products(models.Model):
        name = models.CharField(max_length=250,null=True, blank=True,)
        slug = models.SlugField(max_length=200, unique=True,null=True)
        
    
    class ProductAttribute(models.Model):
        product = models.ForeignKey(Products,on_delete=models.CASCADE, related_name='attributes', default=None)
        attributes = models.ForeignKey(Attributes,on_delete=models.CASCADE, related_name='attributes', default=None)
        values = models.ForeignKey(AttributeTerms, on_delete=models.CASCADE, related_name='attributes', default=None)
    
    
    
    class ProductVariant(models.Model):
        product = models.ForeignKey(Products,on_delete=models.CASCADE)
        variant = models.ForeignKey(ProductAttribute,on_delete=models.CASCADE, null = True, default=None)
        stock = models.IntegerField(default=None)
        stock_threshold = models.IntegerField()
        price = models.DecimalField(max_digits=10, decimal_places=2)
        sku = models.CharField(max_length= 250, default=None)
        sale_price = models.DecimalField(max_digits=10, decimal_places=2)
       
       
    

    在 admin.py

    class ProductAttributeInline(admin.TabularInline):
           model = ProductAttribute
    
    
    class ProductVariationInline(admin.TabularInline):
           model = ProductVariant
           
           
    class ProductVariant(admin.ModelAdmin):
       inlines = [ProductAttributeInline,
                  ProductVariationInline,
                  ]
    
    admin.site.register(Products, ProductVariant)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 2013-10-20
      • 2010-12-18
      相关资源
      最近更新 更多