3

私は3つのモデルを持っています:

class Foo (models.Model):
    date = models.DateField(default = date.today)

class Bar (models.Model):
    foo = models.ForeignKey(Foo)
    another = models.ForeignKey(AnotherClass) #this class is important
    amount = models.IntegerField(default=0)

class AnotherClass (models.Model):
    name = models.CharField()

ここで、表形式のインライン方法で Foo+Bar のインスタンスを追加/変更したいと考えています。重要なのは、各 Bar インスタンスが一定量の AnotherClass インスタンスの参照であり、各 Foo インスタンスがシステム内のすべての AnotherClass の参照を持っている必要があるということです。

したがって、AnotherClass のインスタンスのリストがある場合

AnotherClass1
AnotherClass2
AnotherClass3
AnotherClass4

Foo の追加/変更管理ページは次のようになります。

Add Foo!
--------------------------------------------

date = (datePicker)

Pretty Bar TabularInline
--------------------------------------------
AnotherClass1.name        amount = intPicker
AnotherClass2.name        amount = intPicker
AnotherClass3.name        amount = intPicker
AnotherClass4.name        amount = intPicker

ここで、AnotherClassX.name は編集できず、AnotherClass インスタンスの名前のみが表示されます。

これを行う簡単な方法はありますか?

4

1 に答える 1

0

django.contrib.admin の TabularInline を使用して同様のことができます。以下は例です。モデル コードから管理サイトのものを分離するためだけに、models.py と同じ Django アプリ ('test_app') に admin.py を作成しました。

### models.py ###
from django.db import models
from datetime import date

class Foo (models.Model):
    date = models.DateField(default = date.today)

class AnotherClass (models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return u'%s' % (self.name)

class Bar (models.Model):
    foo = models.ForeignKey(Foo)
    another = models.ForeignKey(AnotherClass) #this class is important
    amount = models.IntegerField(default=0)

    class Meta:
        unique_together = (('foo', 'another'),)

### admin.py ###
from test_app.models import Foo, Bar, AnotherClass
from django.contrib import admin

class BarsInline(admin.TabularInline):
    model = Bar

class FooAdmin(admin.ModelAdmin):
    inlines = (BarsInline,)

admin.site.register(Foo, FooAdmin)
admin.site.register(Bar)
admin.site.register(AnotherClass)

これにより、Foo インスタンスの作成または編集時に複数の Bar 関係を追加または変更する機能が追加されます。AnotherClass の選択肢はドロップダウン メニューですが、AnotherClass.name フィールドは編集できないことに注意してください。

注意すべき 1 つの問題は、記述したモデル スキーマでは、同じ AnotherClass インスタンスを (Bar を介して) Foo に複数回関連付けることができることです。これはあなたが望むものかもしれませんし、そうでないかもしれません。AnotherClass インスタンスと Foo インスタンスの間の複数の関係を防ぐには、上記のコード例で使用されている Bar モデルで Meta オプション 'unique_together' を使用します。この動作を許可する場合は、この Meta クラス オプションを削除するだけです。

于 2013-01-26T19:46:17.923 に答える