2012-04-18 4 views
1

Djangoの管理者は、GET変数を使用して 'オブジェクトの追加'フォームのフィールドを設定する方法を見てきました(たとえば、/admin/app/model/add?title=lolは 'タイトル'フィールドを 'lol'に設定します)。Django admin:GET変数から新しいオブジェクトを取り込む方法は?

しかし、/admin/app/model/add?key=18の行に沿って何かを行い、別のモデルのインスタンスから自分のフィールドのデフォルトデータをロードしたいと考えています。理想的には、私はフォームに値を設定する値についていくつかの処理を行うこともできるようにしたいと思います。これはどうすればいいですか?

答えて

4

私はそれを把握することができました。 add_viewメソッド全体をオーバーライドすることは、あまりにも混乱しているようでした。ありがたいことに、DjangoはrequestGET dict(adminフォームをあらかじめ入力するために使用する)を置き換えることができます。以下の私の仕事:

class ArticleAdmin(admin.ModelAdmin): 
    // ... 

    def add_view(self, request, form_url='', extra_context=None): 
     source_id = request.GET.get('source',None) 
     if source_id != None: 
      source = FeedPost.objects.get(id=source_id) 
      // any extra processing can go here... 
      g = request.GET.copy() 
      g.update({ 
       'title':source.title, 
       'contents':source.description + u"... \n\n[" + source.url + "]", 
      }) 

      request.GET = g 

     return super(ArticleAdmin, self).add_view(request, form_url, extra_context) 

この道を、私はURL内のパラメータから「ソース」オブジェクトを取得し、私はそれから必要な値をロード、私は彼らと一緒にやりたい、と事前移入します形。

+0

これは非常に役に立ちます! – abidibo

2

add_viewModelAdminインスタンスをオーバーライドできます。そこにオブジェクトを追加し、オブジェクトのpkNoneに設定し、そのオブジェクトをinstanceとしてフォームに追加します。 pk == Noneのオブジェクトは常に新しいオブジェクトとしてデータベースのフォームに挿入されますsave()

+0

私はあなたが何を意味するか分かりません。私はadd_viewで遊んだ。しかし、superメソッドはレンダリングされたフォームを返すので、あらかじめそれを設定する方法はわかりません。 – egasimus

+1

まだスーパーメソッドを使用しないでください。 [フォームの作成](https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L936)を変更して、オブジェクトを取得して「初期」として使用することができます。また、 'get_form'をオーバーライドして、正しい' instance'を組み込んだフォームクラスを作成することもできます。これはDRYになりますが、もっと複雑なコードになります。 – ilvar

関連する問題