我需要一種方法來從另一個ModelAdmin修改一個ModelAdmin成員變量。所以我雖然也許我可以使用全局變量。但是,如果有多個用戶同時使用該應用程序,那麼全局變量會不斷地發生意外變化,並且所有地獄都會崩潰。替代Django中的全局變量?
在Django中有任何方法可以讓我從另一個ModelAdmin修改一個ModelAdmin成員變量嗎?
還是我犯了設計錯誤?我做得比實際還是難,還是我錯過了什麼?使用線程和鎖定怎麼樣?消息傳遞?活動?!?!?!幫助
下面是整個故事。我的應用程序讓用戶通過選擇兼容的CPU,主板,內存和硬盤驅動器(按此順序)來構建PC。通過選擇一個CPU,它們僅限於帶有CPU插座的主板。通過選擇帶有DDR3 DIMM的主板,它們僅限於DDR3內存,等等。我們必須創建ManyToManyField關係,並指定中間表(帶有額外的count
字段),並且指定中間表(與其他count
字段一起) through
arg。這要求使用InlineAdmin模型來顯示管理頁面中的字段。
令我高興的是,raw_id_field變量導致下拉小部件被一個按鈕替換,該按鈕彈出與change_list.html相同的表單,並允許用戶過濾/排序/搜索他們想要的部分。但是,這對我的老闆來說還不夠好。現在我需要根據之前的選擇對這些過濾器進行預定義(即在選擇帶有DDR3的主板後,使用DDR3過濾內存)。所以我加入了這一點:Default filter in 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)
會話呢?餅乾? –
@DanMantyla:是的,我在第三句中提到過。這對於[閱讀文檔](https://docs.djangoproject.com/en/dev/topics/http/sessions/)非常具有啓發性,因爲您可能會發現各種可能對您有用的內容項目。請注意*會話保存時的部分* - 如果您不理解它,並且您在會話中保存了列表或字典,它可能會咬你。 –