有没有一种简单的方法可以在Django管理网站中创建链式动态下拉列表?

时间:2019-01-01 15:59:41

标签: django forms foreign-keys cascadingdropdown

此刻,我正在创建一个项目来学习如何使用django。在这个项目中,有三种模型:

  • 类别
  • 子类别
  • 产品

我想要实现的是在选择类别之后动态选择相应的子类别,从而能够添加产品。

  • 我尝试使用没有结果的smart_selects,因为它与python 3.7不兼容

  • 我试图使用选定类别字段作为过滤器来过滤子类别列表,但没有成功,我认为我的代码编写得不好,因此需要使用类别字段的值来过滤列表动态子类别。

这是我的代码:

//////////// //models.py

“”“” Z“”“ 从django.db导入模型

class Category(models.Model):     “”“ Z”“”     category_name = models.CharField(“ Name”,max_length = 50)

class Meta:
    ordering = ('pk',)
    verbose_name = "Category"
    verbose_name_plural = "Categories"

def __str__(self):
    """Z"""
    return self.category_name

class Subcategory(models.Model):

"""Z"""
subcategory_name = models.CharField("Name", max_length=50)
subcategory_parent = models.ForeignKey(
    Category, verbose_name="Parent", on_delete=models.CASCADE)

class Meta:
    ordering = ('pk',)
    verbose_name = "Subcategory"
    verbose_name_plural = "Subcategories"

def __str__(self):
    return self.subcategory_name

类产品(models.Model):     “”“ Z”“”     category = models.ForeignKey(         类别,verbose_name =“类别”,on_delete =模型。SET_NULL,null =真)     子类别=模型.ForeignKey(         子类别,verbose_name =“子类别”,on_delete = models.SET_NULL,null = True)     product_name = models.CharField(“ Name”,max_length = 50,unique = True)

class Meta:
    ordering = ('pk',)
    verbose_name = "Product"
    verbose_name_plural = "Products"

def __str__(self):
    """Z"""
    return self.product_name

//////////// //admin.py

“”“” Z“”“ 从django.contrib导入管理员 从.models导入类别,子类别,产品

class SubcategoryInline(admin.StackedInline):     “”“ Z”“”     型号=子类别     额外= 1

@ admin.register(类别) 类CategoryAdmin(admin.ModelAdmin):     “”“ Z”“”     inlines =(SubcategoryInline,)

@ admin.register(子类别) SubcategoryAdmin(admin.ModelAdmin)类:     “”“ Z”“”

@ admin.register(产品) 类ProductAdmin(admin.ModelAdmin):     “”“ Z”“”     def formfield_for_foreignkey(self,db_field,request,** kwargs):         如果db_field.name ==“子类别”:             kwargs [“ queryset”] = Subcategory.objects.filter(subcategory_parent = request.category)         返回super()。formfield_for_foreignkey(db_field,request,** kwargs)

/////////////////////////////////////// //这是我尝试使用它时显示的错误:

在/ admin / prototype / product / add /

处的

AttributeError

“ WSGIRequest”对象没有属性“类别”

请求方法:GET 要求网址:http://127.0.0.1:8000/admin/prototype/product/add/ Django版本:2.0.9 异常类型:AttributeError 异常值:

“ WSGIRequest”对象没有属性“类别”

异常位置:formfield_for_foreignkey,第30行中的C:\ asp \ pilgrim \ prototype \ admin.py Python可执行文件:C:\ Program Files \ Python37 \ python.exe 的Python版本:3.7.0 Python路径:

['C:\ asp \ pilgrim',  'C:\ Program Files \ Python37 \ python37.zip',  'C:\ Program Files \ Python37 \ DLLs',  'C:\ Program Files \ Python37 \ lib',  'C:\ Program Files \ Python37',  'C:\ Users \ lisandro \ AppData \ Roaming \ Python \ Python37 \ site-packages',  'C:\ Program Files \ Python37 \ lib \ site-packages']

服务器时间:2019年1月1日,星期二11:48:18 -0400

1 个答案:

答案 0 :(得分:0)

您想将过滤后的查询集传递给您在管理员(或特定视图/模板,如果要在真正的前端中执行此操作)中使用的自定义表单。在此处查看答案:https://stackoverflow.com/a/291968/11295291