2012-03-08 11 views
0

私のモデルでは、change_formに余分なコンテンツを表示したいと思います。基本的に、私のモデルは次のようになります。Django:管理用のカスタムコンテンツ

class News(models.Model): 
    ... 

class NewsFromSource(models.Model): 
    news     = models.ForeignKey(News) 
    ... 

は私がクリックされた、「検索」ボタンを追加したい、外部のニュースソースへのWebサービス要求をトリガし、利用可能なコンテンツを引き下げ、およびすべて一覧表示ニュースが含まれています。次いで、ユーザは、管理インターフェースで現在編集されているニュース(すなわち、ウェブサービスを介してダウンロードされたコンテンツに基づいて新しいNewsFromSourceを作成する)に「添付」するピースの1つを選択することができる。

私はウェブサービスを終了しました。検索ボタンを実装し、結果をリスト表示するための最良の方法は何ですか(私はビューとテンプレートが動作し、何らかの形でそれらを取得する必要があります)と保存部分は何ですか?

答えて

1

私は何をやってしまったことは以下の通りです:

1)

私はこれに帰着する検索結果を取得するためのビューを作成:

#/myproject/admin/views.py 
@never_cache 
def news_search(request): 

    #...query web service 
    if 'q' in request.POST: 
     search_term = request.POST['q'] 
    else: 
     search_term = '' 

    news = NewsSearch() 
    news.search(search_term) 

    return render_to_response( 'news_search_results.html', 
          { 'q':   search_term, 
           'news':  news.result_list, 
           'page':   page, 
           'page_left': news.page_left, 
           'page_right': news.page_right} 
           ) 

2)Iビューをマッピングされた:

#/myapp/urls.py 
... 
url(r'^myapp/news/search/$', views.news_search), 

3)私はchange_formを拡張しました。次のコードでニュースモデルのHTML:

#/myproject/templates/admin/myapp/news/change_form.html 
    {% extends "admin/change_form.html" %} 
    {% block after_field_sets %} 
    ... 
    {% csrf_token %} 
    <input type="text" name="q" id="news-search-term"> 
    <div id="news-search-results"></div> 
    ... 
    function submitSearchForm() { 
    $.post("/myapp/news/search/", 
     { 'q': $('#news-search-term').val(), 
      'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val() }, 
     function(data){ 
      $('#news-search-results').html(data); 
     } 
    ); 
} 
    {{ block.super }} 
    {% endblock %} 

4)私は結果を表示するためのHTMLテンプレートを作成した(news_search_results.html、1を参照)

だから、基本的に私はからAJAX要求を送信していますadminページをカスタムビューに移動してWebサービスから結果を取得し、divに表示します。

結果リストの各要素には、ニュースIDを持つ要素をForeignKeyとして格納する別の要求を送信するボタンがあります。

私はこれが特にDjangoの原則に反しているかどうかはわかりません。しかし、それはうまくいくようです。

もっと「ジャンゴニア語」の方法でこれを行う際の提案は大歓迎です。

0
  1. 私たちは、あなたが関連ニュースモデルを持っていると仮定します。 raw_id_fields我々はハックしようとしているModelAdminの、のにそのフィールドを追加します。

  2. 過負荷このモデルためchange_formテンプレートは、そのテンプレートでJavaScriptを追加admin/yourapp/yourmodel/change_form.html

  3. admin/change_form.htmlを拡張します〜:

    1. news raw IDフィールドのフォームから入力と拡大アイコンを非表示にします。それがクリックされたとき、それは開く必要があり

    2. ポップアップがあなたの作業ビュー/テンプレートでなければなりませんポップアップが開きますそのフォームの行のボタンのスタイルを持つスパンのようなものを追加

    3. CSSであまりに

      ことを行うことができますユーザーがニュースを選択すると、フォームでニュース

    4. を選択するために、ニュースのIDを取得するためのAjax POSTリクエストを行い、そして必要がありますポップアップが値を生のidフィールドに設定されている自分自身に

    5. を閉じます入力が隠されている、これはかなり難しいですが、誰かを恐れないで(d isclamer:I)an article with the whole technical detailsを出版は、また、非常にいくつかの仕事になるだろうanother one but I didn't test it

を見つけました。忍耐と忍耐、このミッションBのためのあなたの最高の資質となります)

+0

申し訳ありませんポップアップがjsonを非常に簡単に「返す」ことができないとわかりましたので、私のアドバイスを変更しました – jpic

+0

リンクにアクセスする際に問題があります... – Yann

+0

フィードバックをいただきありがとうございます。ホストファイルをハッキングして...リンクを更新しました – jpic