イアンです。
ForeignKeyでない限り、formfield_for_foreignkeyは使えないと思います。
そうした場合は、結構厳しいと思いますが、ModelAdmin の change_view
を自分で実装するのがおすすめです。そのなかに、自分のフォームインスタンスを作成する感じになると思います。Formは__init__でリクエストを引数として取得して、self.fieldsにrequestを使って、自分のModelChoiceFieldを入れる感じになると思います。
以下のコードを全然保証してないんですが、
class ItemAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
request = kwargs.pop("request") if "request" in kwargs else None
if request:
qs = Shop.objects.filter(user=request.user)
else:
#Error?
qs = Show.objects.all()
self.fields["shop"] = forms.ModelChoiceField(queryset=qs)
return super(ItemAdminForm,self).__init__(*args, **kwargs)
class ItemAdmin(models.ModelAdmin):
...
def change_view(self, request, object_id, extra_context=None):
# これは多分、django/contrib/admin/options.py からほぼコピーする
...
adminForm = ItemAdminForm(request=request)
...
2009/11/11 Toshiyuki Hirooka <toshi....@gmail.com>:
コードの例、ありがとうございます。
いただいたコードから何をしたいか、ということは理解できましたが、
現在、方針に若干の変更がありまして、この方法は繰越となったので、
簡単にやってみる程度でいただいたコードを試してみました。
まず、問題が出たのは、
self.fields["shop"] = forms.ModelChoiceField(queryset=qs)
の個所です。fields ないといわれてしまったので、後回しに。
つぎに、change_view ですが、
adminForm に代入する個所を
adminForm = ItemAdminForm(request=request)
に置き換えると、
Exception Value: Caught an exception while rendering: 'BoundField'
object is not iterable
Original Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/django/template/debug.py",
line 71, in render_node
result = node.render(context)
File "/usr/lib/python2.5/site-packages/django/template/defaulttags.py",
line 125, in render
values = list(values)
TypeError: 'BoundField' object is not iterable
Exception Location:
/usr/lib/python2.5/site-packages/django/template/debug.py in
render_node, line 81
となってしまいましたので、どういうことだろうと少し考えています。
また、同じく add_view も同様にオーバーライドしましたが同じでした。
以上が報告です。
もし解決案などありましたら返信をいただければと思いますが、
これについて、私側での現在は解決を先延ばしにする予定です。
以上です。
2009/11/12 Ian Lewis <ianm...@gmail.com>: