5

わかりました、これを説明するのに苦労しています。詳細を記入する必要があるかどうか教えてください。

私の URL は次のようになります: http://domain.com/<category >/
<category> には 1 つまたは複数のサブカテゴリがあります。

カテゴリ ページに、カテゴリのサブカテゴリを含む選択ボックス (他のフィールドの中でも) を備えたフォームが必要です。現在、テンプレートの 1 つでフォームをハードコーディングしていますが、モデルを直接反映させたいと考えています。

現在ハードコードされているソリューションでは、カテゴリ ビューに次のように表示されます。

s = Category.objects.filter(parents__exact=c.id)  

フォーム テンプレートが繰り返し実行され、選択ボックスが出力されます (以下のモデル コードを参照)。

カテゴリを除外するinitを備えたModelFormSetが必要だと思いますが、ドキュメントでそれを行う方法が見つからないようです。

Django ModelFormでForeignKeyの選択をフィルタリングするにはどうすればよいですか? 同様に、しかし、私はそれを適切に動作させることができません。

私のモデル

# The model that the Form should implement
class Incoming(models.Model):
    cat_id = models.ForeignKey(Category)
    zipcode = models.PositiveIntegerField()
    name = models.CharField(max_length=200)
    email = models.EmailField()
    telephone = models.CharField(max_length=18)
    submit_date = models.DateTimeField(auto_now_add=True)
    approved = models.BooleanField(default=False)

# The categories, each category can have none or many parent categories
class Category(models.Model):
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField()
    parents = models.ManyToManyField('self',symmetrical=False, blank=True, null=True)

    def __unicode__(self):
        return self.name

私のフォーム

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming
4

2 に答える 2

9

あなたが言うように、カスタムのモデルフォームクラスが必要です__init__:

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming

    def __init__(self, *args, **kwargs):
        super(IncomingForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['parents'].queryset = Category.objects.filter(
                                              parents__exact=instance.id)
于 2009-06-07T17:24:02.863 に答える
6

ダニエル・ローズマンの返信を編集して勝者に投票しますが、編集できないため、ここに正しい回答を投稿します。

class IncomingForm(ModelForm):
    class Meta:
        model = Incoming

    def __init__(self, *args, **kwargs):
        super(IncomingForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.fields['cat_id'].queryset = Category.objects.filter(
                    parents__exact=self.instance.id)

違いは、self.fields['cat_id'] (正しい) とself.fields['parents'] (間違っています。どちらも同じ間違いを犯しました) です。

于 2009-07-15T16:20:44.097 に答える