0

モデルの 1 つで、change_form に追加のコンテンツを表示したいと考えています。基本的に、私のモデルは次のようになります。

class News(models.Model):
    ...

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

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

これで Web サービスは完了です。検索ボタン、結果のリスト表示 (機能するビューとテンプレートがあり、それらを何らかの方法でフォームに取り込む必要があります) と保存部分を実装するための最良のアプローチは何ですか?

4

2 に答える 2

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)ビューをマッピングしました:

#/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 要求を送信して、Web サービスから結果を取得し、それを div に表示しています。

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

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

より「Djangonian」な方法でこれを行うことについての提案は大歓迎です。

于 2012-03-09T12:19:16.597 に答える
0
  1. 関連する News モデルがあると仮定します。そのフィールドを、これからハッキングするmodeladminの raw_id_fields に追加します。

  2. このモデルのchange_formテンプレートをオーバーロードし、拡張admin/change_form.htmlしますadmin/yourapp/yourmodel/change_form.html

  3. そのテンプレートに JavaScript を追加して、次のようにします。

    1. 入力と拡大鏡のアイコンをニュース raw id フィールドフォーム raw から非表示にします。これは css でも行うことができます

    2. クリックするとポップアップを開くフォーム行にボタンスタイルを持つスパンのようなものを追加します

    3. 開く必要があるポップアップは、ニュースを選択するためのフォームを含む作業ビュー/テンプレートである必要があります

    4. ユーザーがニュースを選択すると、ポップアップは ajax 投稿リクエストを実行してニュース ID を取得し、それ自体を閉じます。

    5. 値は、非表示の未加工の ID フィールド入力に設定されます。これはかなり難しいですが、恐れる必要はありません (免責事項: 私)技術的な詳細全体を含む記事を公開し、別の記事も見つけましたが、テストしませんでした

かなりの作業になります。忍耐力と忍耐力は、このミッションの最高の資質になります B)

于 2012-03-08T15:39:12.977 に答える