2017-12-07 4 views
0

Djangoアプリケーションの適切な構造を理解するために少し苦労します。特に、私はその意見を頭に浮かべるのに苦労している。Djangoアプリケーションの正しい構造とビューとサブビューの処理

だから私は、このファイル

base.html 

を持っていると私は、このファイルは、これまでのところは良いなど、フッター、ナビゲーションバー、頭など、アプリケーション全体の共通要素

を持っていることがわかっています。私base.htmlファイル内 私はタグがあります:

{% block content %} 
{% endblock %} 

アプリケーションの動的コンテンツを処理します。 は、今私はhome.htmlと呼ばれる静的なページを作成し、そのファイル内に、私は

{% extends 'base.html' %} 
... Whatever I want 
{% block content %} 

を入れて、今、私は本当にそれがどのように動作するかを理解するのに苦労パーツを付属しています。 dashboardという新しいアプリを作成します。 dashboard.htmlファイルを作成し、home.htmlと同様に、ベースを拡張しますが、要素はcontent block内に拡張します。生成されたアプリケーションのviews.pyでは、私は定義:

@login_required(login_url="login/") 
def dashboard(request): 
    return render(request, "dashboard.html") 

dashboard.html

{% extends 'base.html' %} 
{% block content %} 
    <div class="dashboard-page"> 
     <div class="row equal-sides"> 
      <div class="col-sm-2 trim-right"> 
       {% include 'dashboard_navigation.html' %} 
      </div> 
      <div class="col-sm-10 trim-left"> 
       <div class="dashboard-main card"> 
        <h3>Welcome to your dashboard</h3> 
       </div> 
      </div> 
     </div> 
    </div> 
{% endblock %} 

enter image description here

幸せな日。今度は、左側のナビゲーションバーからの選択に応じて、右側のメインコンテナのみをリロードします。どのように達成するのですか?

URLファイル内に新しいURLを追加し、views.pyファイル内の対応するビューを追加すると、それはすべてうまくいくと思いました。

def single_search(request): 
    tweets = get_tweets() 
    context = {'tweets': tweets} 
    return render(request, "search.html", context) 

urls.py

url(r'^dashboard', views.dashboard, name='dashboard'), 
url(r'^dashboard/search$', views.single_search, name='search'), 

しかし、私が取得することは、私は問題を回避移動して、次のコードを使用して「適切な」コンテンツを表示するために管理dashboard.html enter image description here

と同じページです:

{% extends 'base.html' %} {% block content %} 
    <div class="dashboard-page"> 
     <div class="row equal-sides"> 
      <div class="col-sm-2 trim-right"> 
       {% include 'dashboard_navigation.html' %} 
      </div> 
      <div class="col-sm-10 trim-left"> 
       <div class="dashboard-main card"> 

        {% if 'search' in request.path %} 
         {% include 'search.html' %} 
        {% else %} 
         <h3>Welcome to your dashboard</h3> 
        {% endif %} 
       </div> 
      </div> 
     </div> 
    </div> {% endblock %} 

しかし、私はそれが正しい方法ではないことを知っています。私が渡している文脈は、それがinclude 'search.html'タグの中にあるという事実のために返されていないことも知っています。ダッシュボード内で同じコンテキストを渡すと、search.htmldashboard.htmlの両方で動作しますが、残念ながらユーザーがsearch.htmlサブページにある場合にのみそのコンテンツが表示されます。

また、私は自分のアプリケーションの木を追加します。

enter image description here

私はあなたの助けを本当に感謝します。

おかげで、

エイドリアン

答えて

2

は、問題は、あなたのダッシュボードのURLパターンを終了していないので、それは両方のURLと一致していることだけです。それは次のようになります。

url(r'^dashboard$', views.dashboard, name='dashboard'), 

あなたは正規表現が紛らわしい見つけた場合は、Djangoの2.0の新path構文が簡単になります。

+0

説明のために:Djangoは、提供されたURLと一致する正規表現が見つかるまで、可能なビューのリストをダウンします。それが終わると、それは検索を停止し、あなたをそのビューに送ります。 'search'ビューがURLリストの' dashboard'ビューの前に置かれていれば、 'search'ビューが最初に見つかったため、実際にはうまくいきました。ダニエルが指摘したことは、オーダーがビュールーティングの決定要因にならないようにするためのベストプラクティスです。 – MCBama

+0

聖なる牛!多くのありがとう、ダニエル!あなたの解決策は私の問題を解決しました。 –

関連する問題