[解決済み] DjangoのモデルフォームでForeignKeyの選択肢をフィルタリングするにはどうすればよいですか?
質問
例えば、以下のような
models.py
:
class Company(models.Model):
name = ...
class Rate(models.Model):
company = models.ForeignKey(Company)
name = ...
class Client(models.Model):
name = ...
company = models.ForeignKey(Company)
base_rate = models.ForeignKey(Rate)
すなわち、複数の
Companies
の範囲を持ち、それぞれが
Rates
と
Clients
. それぞれ
Client
は、ベースとなる
Rate
親から選ばれた
Company's Rates
でなく、別の
Company's Rates
.
を追加するためのフォームを作成する場合
Client
を削除したい。
Company
のボタンで既に選択されているため)。
Company
ページ)を制限し
Rate
の選択肢は、その
Company
もあります。
Django 1.0ではどうすればいいのでしょうか?
私の現在の
forms.py
ファイルは、今のところ単なるボイラープレートです。
from models import *
from django.forms import ModelForm
class ClientForm(ModelForm):
class Meta:
model = Client
そして
views.py
も基本です。
from django.shortcuts import render_to_response, get_object_or_404
from models import *
from forms import *
def addclient(request, company_id):
the_company = get_object_or_404(Company, id=company_id)
if request.POST:
form = ClientForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(the_company.get_clients_url())
else:
form = ClientForm()
return render_to_response('addclient.html', {'form': form, 'the_company':the_company})
Django 0.96 では、テンプレートをレンダリングする前に以下のようなことをすることで、これをハックすることができました。
manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]
ForeignKey.limit_choices_to
は期待できそうですが、どのようにして
the_company.id
というのも、Admin インターフェイスの外側でそれが機能するかどうかがわからないからです。
ありがとうございます。 (これはかなり基本的な要求のようですが、もし私が何かをデザインし直すべきなら、提案を受け付けます)
どのように解決するのですか?
ForeignKey は django.forms.ModelChoiceField で表現され、これは選択肢をモデルの QuerySet とする ChoiceField です。 のリファレンスを参照してください。 ModelChoiceField .
そこで、QuerySetをフィールドの
queryset
属性で指定します。 フォームの構築方法によります。 明示的なフォームを構築する場合は、フィールドの名前を直接指定することになります。
form.rate.queryset = Rate.objects.filter(company_id=the_company.id)
デフォルトのModelFormオブジェクトを取る場合。
form.fields["rate"].queryset = ...
これは、ビューで明示的に行われます。 ハックする必要はありません。
関連
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 辞書を値で並べ替えるにはどうしたらいいですか?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python string splicing.join()とsplitting.split()の説明
-
Python カメの描画コマンドとその例
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み] 'DataFrame' オブジェクトに 'sort' 属性がない
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない