我需要一种从另一个 ModelAdmin 修改一个 ModelAdmin 成员变量的方法。所以我虽然也许我可以使用一个全局变量。但是,如果有多个用户同时使用该应用程序,那么全局变量将继续意外更改,所有地狱都会崩溃。
Django 中是否有任何方法可以让我从另一个 ModelAdmin 修改一个 ModelAdmin 成员变量?
还是我犯了设计错误?我是不是让这件事变得比实际更难,还是我错过了什么?那么使用线程和锁呢?消息传递???活动?!?!?!帮助
这是整个故事。我的应用程序允许用户通过选择兼容的 CPU、主板、内存和硬盘驱动器(按此顺序)来构建 PC。通过选择 CPU,它们仅限于带有 CPU 插槽的主板。通过选择带有 DDR3 调光器的主板,它们仅限于 DDR3 内存等等。
此外,感觉每个系统可能有许多相同的部分(例如:内存模块,但它们必须相同),我必须创建 ManyToManyField 关系并使用arg指定中间表(带有额外count
字段) 。through
这需要使用 InlineAdmin 模型来显示管理页面中的字段。
令我高兴的是,raw_id_field 变量导致下拉小部件被替换为一个按钮,该按钮弹出一个与 change_list.html 相同的表单,并允许用户过滤/排序/搜索他们想要的部分。然而,这对我的老板来说还不够好。现在我需要根据之前的选择预定义这些过滤器(即在选择带有 DDR3 的主板后过滤带有 DDR3 的内存)。所以我暗示了这个:Django admin中的默认过滤器,但我需要一种方法来根据他们所做的其他选择动态CpuAdmin.default_filters
设置。PcAdmin
我的模型,为简洁起见,仅包括一个部分模型:
# models.py
class CPU(Part):
partNum = models.CharField(max_length=60)
price = models.DecimalField(precision=2)
socket = models.CharField(max_length=60)
numCores = models.CharField(max_length=60)
class PC(models.Model):
name = models.CharField(max_length=60)
customer = models.CharField(max_length=60)
cpuChoices = models.ManyToManyField(CPU, through='PcCpuChoice')
memoryChoices = models.ManyToManyField(Memory, through='PcMemoryChoice')
hardDriveChoices = models.ManyToManyField(HardDrive, through='PcHardDriveChoice')
motherBoardChoices = models.ManyToManyField(MotherBoard, through='PcMotherboardChoice')
class PcCpuChoice(models.Model):
pc = models.ForeignKey(PC, unique=False)
cpu = models.ForeignKey(CPU, unique=False)
count = models.IntegerField()
# admin.py
class PartAdmin(admin.ModelAdmin):
class Meta:
abstract = True
search_fields = ['partNum', 'description', 'model']
default_filter = []
def changelist_view(self, request, extra_context=None):
if not request.GET.has_key(self.default_filter[0]):
q = request.GET.copy()
q[self.default_filter[0]] = self.default_filter[1]
request.GET = q
request.META['QUERY_STRING'] = request.GET.urlencode()
return super(PartAdmin,self).changelist_view(request, extra_context=extra_context)
class CpuAdmin(PartAdmin):
list_filter = ['brand', 'socket', 'numCores', 'graphics']
list_display = ('partNum', 'description', 'brand', 'model', 'markupPrice', 'clockSpeed', 'watts', 'voltage')
default_filter = ['numCores','8'] # need to change this from PcAdmin!!!
class PcCpuInline(admin.TabularInline):
model = PcCpuChoice
extra = 1
max_num = 1
raw_id_fields = ['cpu']
class PcAdmin(admin.ModelAdmin):
inlines = [PcCpuInline, PcMotherboardInline, PcMemoryInline, PcHardDriveInline]
admin.site.register(PC, PcAdmin)