2012-03-08 16 views
0

私はdjango 1.2を使用しています 私は2つのモデルがあります。djangoでForeignKeyを制限する方法

EDITは:私が好きな子を選択できるようにしたいと思います。この例では

class Parent(models.Model): 
    name = models.CharField(max_length=255) 
    favorite_child = models.ForeignKey(Child) 

class Child(models.Model): 
    name = models.CharField(max_length=255) 
    myparent = models.ForeignKey(Parent) 

が、問題は管理者が私にすべての子を与えるということである:私はちょうどよりよい例を見つけました私は現在編集中の親の子供であるものからだけでなく、選択します。

元の例:

class Version(models.Model): 
    name = models.CharField(max_length = 255) 
    platform = models.ForeignKey("Platform",related_name='version_platform') 

class Platform(models.Model): 
    name = models.CharField(max_length = 255) 
    default_version = models.ForeignKey(Version,related_name='platform_default_version') 

は私がdefault_versionを選択したときに私は、現在のプラットフォームを持っているこれらのバージョンを選択することができますように、Djangoの管理者は、ドロップダウンを制限したいです。
たとえば、プラットフォームとしてjoomlaとバージョン '1.2'を持つ '1.1'という名前のバージョンがある場合、プラットフォームとしてwordpressを持っています。
私はそれをに表示するには、ドロップダウンで私のバージョン '1.2'を表示するために私はWordPressの管理者のdefault_versionドロップダウンを選択します。今はそれが私にすべてのバージョンを表示します。

ので、私はこの試みるhere を示したように、私はlimit_choices_toを制限しようとしています:

class Platform(models.Model): 
    name = models.CharField(max_length = 255) 
    default_version = models.ForeignKey(Version,limit_choices_to={'platform':XXXXX},related_name='platform_default_version') 

をしかし、私は、私は自己を入れてみたが、それはうまくいきませんでしたXXXXのinsted入れすべきこととして失われています。
はまた、私はどちらか動作しませんでした

limit_choices_to={'platform.name':name} 

を試してみました。

この例では好きな子を選ぶことができますが、問題は管理者が親の子である子供だけでなく、私が現在編集しているすべての子供を私に与えることです。

+1

limit_choices_toは、httpを参照して、動的な値では動作しません。com/questions/1968596/django-limit-choices-is-this-correct私はこれがあなたが編集していない新しいプラットフォームを追加しようとしているようにあなたのケースを助けるかどうか分からないのですか? – JamesO

+0

あなたの2番目の例に関しては、あなたの子供のための 'お気に入り'ブール値フィールドを持っていて、 'unique_together'を使います。 –

+0

しかし、私は間違いのために部屋を開く2人の好きな子供を選ぶことができます。 – yossi

答えて

2

私はadmin.pyに 溶液を添加Django: accessing the model instance from within ModelAdmin?

に基づいて解決策を見つけた:// stackoverflowの:

class ParentForm(ModelForm): 
def __init__(self, *args, **kwargs): 
    super(ParentForm, self).__init__(*args, **kwargs) 
    self.fields['favorite_child'].queryset = \ 
    Child.objects.filter(parent=self.instance.pk) 

class ParentAdmin(admin.ModelAdmin): 
    form = ParentForm 
2

あなたはformfield_for_foreignkeyを試みることができる:

class PlatformAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "default_version": 
      kwargs["queryset"] = Version.objects.filter(platform=self.instance.pk) 
     return super(PlatformAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
+0

しかし、私はXXXXのinstedを置くのですか? 、文字列ではありません。 – yossi

+0

文字列を動的値に置き換えます。 –

+0

動的値は、現在オブジェクトを編集しているプラ​​ットフォームです。私は自己を使ってみました。 – yossi

0

ここでの問題は、歪んたどっています。どちらのプラットフォームが選択されているかに基づいて適応するバージョンオプションについて話しているときは、AJAXについて話しています。プラットフォームを引数として受け取り、JSON形式のバージョンリストを返すビューを作成するだけです。

次に、AJAX経由でそのビューを取得し、JSON応答を使用してバージョン選択ボックスの新しいオプションセットを構築するプラットフォーム選択ボックスのonchangeイベントにハンドラを添付します。古いオプションを新しいものと置き換えてください。

このサイトとウェブ上には多くの例があります。

+0

私は自分自身を私はこの問題は、クライアント側を使用せずにbtwを持っていないだろうビューを行っていた場合、私はジャンゴ管理者について話しています。 – yossi

+0

プラットフォームのchange_viewページのバージョンドロップダウンメニューの値を制限したいと思っていたのを理解しました。 –

+0

問題は、Django自体のバージョンドロップダウンを制限しているため、プラットフォームが変更された場合に問題が発生する可能性があります。プラットフォームを切り替えると、以前のプラットフォームの選択肢しか残っていませんし、AJAXを実装してバージョンの選択肢を更新しても、古いプラットフォームのものに限定されているため、検証されません。潜在的なバージョンのリストをそのまま渡してからAJAXでフィルタリングして、すべての使用シナリオをカバーする必要があります。 @yossi:これが管理者にあるという事実は、AJAXを使用して選択肢を変更する能力には何の影響もありません。 –

関連する問題