別の ModelAdmin から 1 つの ModelAdmin メンバー変数を変更する方法が必要です。それで、グローバル変数を使用できるかもしれません。ただし、複数のユーザーが同時にアプリを使用している場合、グローバル変数が予期せず変更され続け、すべての地獄が解き放たれます。
Django に、ある ModelAdmin メンバー変数を別の ModelAdmin から変更できる方法はありますか?
それとも設計ミスですか?私はこれを実際よりも難しくしていますか、それとも何か不足していますか? スレッド化とロックの使用についてはどうですか? メッセージの受け渡し??? イベント?!?!?! ヘルプ
これが全体の話です。私のアプリでは、互換性のある CPU、マザーボード、メモリ、およびハード ドライブを (この順序で) 選択することで、ユーザーが PC を構築できます。CPU を選択することで、CPU のソケットを備えたマザーボードに限定されます。DDR3 調光機能を備えたマザーボードを選択すると、DDR3 メモリに制限されます。
また、システムごとに同じ部品が多数存在する可能性があることを認識してください (例: メモリ モジュールですが、それらは同一である必要がありますcount
) through
。これには、InlineAdmin モデルを使用して管理ページにフィールドを表示する必要があります。
嬉しいことに、raw_id_field 変数により、ドロップダウン ウィジェットが、change_list.html と同じフォームをポップアップ表示するボタンに置き換えられ、ユーザーが必要な部分をフィルター/並べ替え/検索できるようになりました。しかし、これは私の上司にとって十分ではありませんでした。ここで、以前の選択に従ってこれらのフィルターを事前定義する必要があります (つまり、DDR3 を搭載したマザーボードを選択した後、DDR3 を搭載したメモリのフィルター)。だから私はこれを実装しました:Django管理者のデフォルトフィルターですが、他の選択に基づいて動的に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)