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

Posted

技术标签:

【中文标题】有没有一种简单的方法可以在 Django 管理站点中创建链式动态下拉列表?【英文标题】:Is there a simple way to create Chained Dynamic Drop Down List in Django Admin Site? 【发布时间】:2019-05-28 13:01:31 【问题描述】:

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

类别 子类别 产品

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

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

我尝试使用选择的类别字段作为过滤器来过滤子类别列表,没有成功,我认为我没有很好地编写代码,因此它需要类别字段的值来过滤列表子类别的动态。

这是我的代码:

models.py

"""Z"""
from django.db import models

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

class Product(models.Model):
    """Z"""
    category = models.ForeignKey(
        Category, verbose_name="Category", on_delete=models.SET_NULL, null=True)
    subcategory = models.ForeignKey(
        Subcategory, verbose_name="Subcategory", 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"""
from django.contrib import admin
from .models import Category, Subcategory, Product

class SubcategoryInline(admin.StackedInline):
    """Z"""
    model = Subcategory
    extra = 1

@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    """Z"""
    inlines = (SubcategoryInline,) 

@admin.register(Subcategory)
class SubcategoryAdmin(admin.ModelAdmin):
    """Z"""

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    """Z"""
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "subcategory":
            kwargs["queryset"] = Subcategory.objects.filter(subcategory_parent=request.category)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

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

AttributeError at /admin/prototype/product/add/

'WSGIRequest' object has no attribute 'category'

Request Method:     GET
Request URL:    http://127.0.0.1:8000/admin/prototype/product/add/
Django Version:     2.0.9
Exception Type:     AttributeError
Exception Value:    

'WSGIRequest' object has no attribute 'category'

Exception Location:     C:\asp\pilgrim\prototype\admin.py in formfield_for_foreignkey, line 30
Python Executable:  C:\Program Files\Python37\python.exe
Python Version:     3.7.0
Python Path:    

['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']

Server time:    Tue, 1 Jan 2019 11:48:18 -0400

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于有没有一种简单的方法可以在 Django 管理站点中创建链式动态下拉列表?的主要内容,如果未能解决你的问题,请参考以下文章

Django-Admin 站点的内置树视图?

完全自定义 django 管理站点

无法登录到 Django 管理站点

Django:从管理站点显示换行符?

在 nginx 上更改标题“Django 管理”文本

有没有一种简单的方法可以在 django 中获取用户的组名