【问题标题】:How to Nested Categories in django admin如何在 django admin 中嵌套类别
【发布时间】:2020-07-10 11:27:45
【问题描述】:

我想在我的电子商务网站中创建多个类别,其中子类别将取决于主类别。 请帮我解决这个问题

 class MainCategory(models.Model):
#     name = models.CharField(max_length=50)
#     date_created = models.DateTimeField(auto_now_add=True)

#     def __str__(self):
#         return self.name

# class SubCategory(models.Model):
#     perentcategory = models.OneToOneField(MainCategory, on_delete=models.CASCADE, primary_key=True) 
#     name = models.CharField(max_length=50)
#     date_created = models.DateTimeField(auto_now_add=True)

#     def __str__(self):
#         return self.name


# class Items(models.Model):
#     main = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
#     name = models.CharField(max_length=255)

第四次发这个问题

【问题讨论】:

  • 你没有问过问题。您究竟需要什么帮助?
  • 我想创建动态嵌套类别模型,所以当管理员添加新产品时,它将显示第一个主要类别,然后管理员可以选择子类别

标签: django python-3.x django-models django-forms django-templates


【解决方案1】:

models.OneToOneField 更改为models.ForeignKey,这样您就可以将多个子类别分配给一个主类别:

class MainCategory(models.Model):
     name = models.CharField(max_length=50)
     date_created = models.DateTimeField(auto_now_add=True)

     def __str__(self):
         return self.name

 class SubCategory(models.Model):
     main_category = models.ForeignKey(MainCategory, on_delete=models.CASCADE, primary_key=True) 
     name = models.CharField(max_length=50)
     date_created = models.DateTimeField(auto_now_add=True)

     def __str__(self):
         return self.name


 class Items(models.Model):
     main = models.ForeignKey(SubCategory, on_delete=models.CASCADE)
     name = models.CharField(max_length=255)

【讨论】:

  • 您好,感谢您的回答,但我也希望管理员选择第一个主目录,然后其相关类别将显示在产品添加中
  • 嗨。它回答了你的问题吗?如果没有,如果您可以分享有关该问题的更多详细信息,我可以修改我的答案。
  • 我想创建嵌套类别,所以当我子类别时,我会选择 perent 主要类别,它可以作为您在上面解决的问题,但我也希望当我添加产品时,我想先选择主要类别,然后再选择子类别类别将根据主类别显示在您的解决方案中,我只能选择子类别,但我也想在产品添加中选择主类别
  • 你在使用 django 管理员吗?
  • 您必须为您的 ModelAdmin 设置自定义表单,然后将 JS 文件添加到管理页面,以便在主类别下拉列表更改时更新子类别下拉列表。如果您对两步过程没问题,即选择主类别,然后保存,然后选择子类别,然后再次保存,您可以向模型添加主类别字段,并在 @987654324 中过滤子类别表单字段@ 基于实例的主要类别字段。如果您明白我的意思并更喜欢其中一种解决方案,我可以指导您找到正确的资源,但这不是一项简单的任务。
【解决方案2】:

您可以使用单个模型来容纳类别和子类别。像这样。

class Category(models.Model):
    name = models.CharField(blank=False, max_length=200)
    slug = models.SlugField(null=False)
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='children', on_delete=models.SET_NULL)

然后在上面的模型中添加如下函数

def get_categories(self):
         if self.parent is None:
              return self.name
         else:
             return self.parent.get_categories() + ' -> ' + self.name
    
def __str__(self):
        return self.get_categories()

这将返回类似于this image的结构

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 2023-03-20
    • 1970-01-01
    • 2019-10-25
    • 2018-09-10
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多