やあ!
私は仕事で問題に取り組んでいて、それに取り組む最も慣用的な方法は何であるか疑問に思いました。 モデルの外部キー用に複数のModelMultipleChoiceFilter
フィルターフィールドがあります。 URLで主キーを公開せずに、 CheckboxSelectMultiple
ウィジェットを使用しながら、外部キーの一意の属性でフィルタリングする方法を見つけようとしています。
これは、(多かれ少なかれ)私が今どのように設定しているかを示す例です。
# app/models.py
from django.db import models
class Foo(models.Model):
prop = models.CharField(max_length=55, unique=True)
def __str__(self):
return self.name
class Bar(models.Model):
foo = models.ForeignKey(Foo, related_name="bars")
# app/filters.py
import django_filters
from app.models import Bar, Foo
class BarFilter(django_filters.FilterSet):
foo = django_filters.ModelMultipleChoiceFilter(
queryset=Foo.objects.all(),
widget=CheckboxSelectMultiple(),
label="Foo",
label_suffix="",
)
class Meta:
model = bar
fields = ['foo']
これは、ビューではまったく問題なく機能します。 フィルタは機能し、適切なウィジェットで正しくフィルタリングします。 ただし、URLには主キーが含まれているため、この例では/?foo=1
ですが、pkが公開されないようにし、URLを読みやすくするために、 /?foo=<prop value>
読み取ります。
Djangoの他の場所では機能する傾向があるため、このようなフィールドを変更してみました。
# app/filters.py
...snip...
class Meta:
model = bar
fields = ['foo__prop']
これにより、URLは必要に応じて/?foo=<prop value>
応答しますが、フォームにCheckboxSelectMultiple
を使用しなくなりました。 属性をfoo__prop
にもしようとしましたが、フォームのレンダリングが正しくありませんでした。
私がやろうとしていることは、ほとんど機能していることを考えるとサポートされているように感じますが、それを取得する方法がよくわからないようです。 これが現在サポートされている範囲外の場合は、これを処理するための独自のフォームを作成できます。 助けてくれて、素晴らしいプロジェクトをありがとう!
ひや。 いい問題です。 厳密には使用法の質問ですが、よく読んでいただければ幸いです。
フィルタのfield_name引数を見ましたか?
https://django-filter.readthedocs.io/en/master/ref/filters.html
これにより、foo_propをfooフィルターのターゲットとして使用できるようになります。
私はそれがうまくいくと想像します...多分あなたはウィジェットなどで選択を設定する必要があるでしょう(しかしそれは処理されるべきです...)
こんにちは、返信に時間を割いていただきありがとうございます!
あなたは私を正しい軌道に乗せました! 私は昨日これを実装する機会を得ました、そしてfield_name
引数を使うことはうまくいきました!
この問題を読む可能性のある将来の人のために、コードがどのように出てきたかは次のとおりです。
# app/filters.py
...snip
class BarFilter(django_filters.FilterSet):
foo = django_filters.ModelMultipleChoiceFilter(
queryset=Foo.objects.all(),
field_name="foo__prop", # This lets us keep the url as "/?foo=<value>
to_field_name="prop",
widget=CheckboxSelectMultiple(),
label="Foo",
label_suffix="",
)
class Meta:
model = bar
fields = ['foo']
これへの参照は、 @ carltongibsonが言及したスレッドのドキュメントにあります。 具体的には、ModelMultipleChoiceフィルターのセクションを参照してください。
とにかく、私を助けるために時間を割いてくれてありがとう!
素晴らしい。 解決してよかったです。 素晴らしい!
よくやった ! ありがとうございました !
最も参考になるコメント
こんにちは、返信に時間を割いていただきありがとうございます!
あなたは私を正しい軌道に乗せました! 私は昨日これを実装する機会を得ました、そして
field_name
引数を使うことはうまくいきました!この問題を読む可能性のある将来の人のために、コードがどのように出てきたかは次のとおりです。
これへの参照は、 @ carltongibsonが言及したスレッドのドキュメントにあります。 具体的には、ModelMultipleChoiceフィルターのセクションを参照してください。
とにかく、私を助けるために時間を割いてくれてありがとう!