2015-12-16 19 views
5

私は自分でDjangoを学習しています。普通のPythonクラスをどこに実装するのかわかりません。私が意味することは、私が書いたPythonクラスはどこに行くのか分かりません。別のファイルに入れてviews.pyにインポートするか、views.pyファイル内に実装されているクラスは同じですか?DjangoでPythonクラスを実装する場所は?

例を実装したいのですが、モジュール内の別のファイルでこれを実行するか、またはviews.pyファイル内の関数を実装するだけですか?

+4

あなたが望むところでは、それは単なるPythonです。 – davidism

+2

djangoがどこにでも置くことができます。私はしばしば汎用ユーティリティ用のutilsモジュールを持っています。 – fiacre

+0

答えをありがとう!しかし、別のファイルに入れてからインポートすると、HTMLテンプレートの属性をどのように印刷できますか?私は、views.pyの関数を通して要求とテンプレート名を返さなければならないことを知っています。しかし、テンプレートページに属性を渡すことはできません。 – Silvestrini

答えて

4

私が書き込むPythonクラスはどこにありますかわかりません。彼らは別のファイル に入り、次にviews.pyにインポートされます。 例クラスアルファベットを実装したいと思います。

それはあなたのimport文が正しい取得の問題だ:あなたのビューで次に

django_proj1/ 
    django_proj1/ 
    myapp/ 
     myclasses.py 
     views.py 

#myapp/views.py: 
from myapp.myclasses import Alphabet 

それとも、あなたはこのようにそれを行うことができます:

django_proj1/ 
    django_proj1/ 
     myclasses.py 
    myapp/ 
     views.py 

あなたの意見で:

#myapp/views.py: 
from django_proj1.myclasses import Alphabet 

コメントへの応答:

そして、私は成功した私は、HTMLテンプレートに 属性を渡すんどのように、私のクラスをインポートした後?

以下は公式django tutorialからまっすぐです。

myappに/ views.py

from django.shortcuts import render 
from django.http import HttpResponse 

from myapp.myclasses import Alphabet #<*** Import your class. 
from django.template import RequestContext, loader #<*** Import stuff for the template. 

# Create your views here. 

def index(request): 
    alph = Alphabet() 
    result = alph.change('hello') #Your class produces some result here. 

    template = loader.get_template("myapp/index.html") 
    context = RequestContext(request, { 
     'x' : result #<*** Make a variable named x available in your template. 
    }) 

    return HttpResponse(template.render(context)) 

directory structureは次のようになります。

django_proj1/ 
    django_proj1/ 
    myapp/ 
     myclasses.py 
     views.py 
     templates/ <***Create this directory 
      myapp/ <***Create this directory 
      index.html <***Create this file 

myappに/テンプレート/ myappに/ index.htmlを

{% if x %} 
<div>The result you requested was: {{x}}</div> 
{% else %} 
<div>Sorry, couldn't get the result.</div> 
{% endif %} 

myapp/myclassesPY

class Alphabet: 
    def change(self, word): 
     return word + 'Z' 

スタートサーバー

.../my_django_projects/django_proj1$ python manage.py runserver 

URLお使いのブラウザで:

http://localhost:8000/myapp/ 

あなたが表示されるはずです。

あなたが要求した

結果は以下のとおりであった:helloZ

あなたはmyapp/views.pyに次の行をコメントアウトした場合:

context = RequestContext(request, { 
     #'x' : result #<*** Make a variable named x available in your template. 
    }) 

はその後、テンプレートは、ブラウザにindex.htmlelse部分をお送りします

申し訳ありませんが、結果を得ることができませんでした。

django_proj1/django_proj1/urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 

from . import views 

urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'dj1.views.home', name='home'), 
    # url(r'^blog/', include('blog.urls')), 

    url(r'^admin/', include(admin.site.urls)), 

    url(r'^myapp/', include('myapp.urls')), 

) 

django_proj1/myappに/ urls.py:

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
] 
+0

そして、私は成功した私のクラスをインポートした後、どのように私は、HTMLテンプレートに属性を渡すのですか?私はrender.py()またはrender_to_responseを使ってviews.pyで作成されたクラスのオブジェクトを返しますか? – Silvestrini

+0

この –

+0

@Silvestriniを行う方法のアイデアのための私の答えをチェックし、私の答えの下で私の応答を参照してください。 – 7stud

3

Djangoは一日の終わりにちょうどPythonのです。

プロジェクトのどこにでも新しいモジュールを作成し、ビュー、モデル、URLなどにインポートすることができます。一般的なutils(utils.py)の構成方法はよくあります。

あなたは、例えば、いくつかの方法で、あなたの意見にデータを配信することができます

from your_module import some_object 

class MyView(TemplateView): 
    template_name = 'some_template.html' 

    def get_context_data(self, **kwargs): 
     context = super(MyView, self).get_context_data(**kwargs) 
     context['my_data'] = some_object.some_method() 
     return context 

そしてsome_template.htmlでは:{{ my_data }}

1

それはアルファベットクラスのスコープに依存します。それがユーティリティクラスであれば、例えばutils.pyファイルを入れることをお勧めします。しかし、主にUI処理を扱うクラスをviews.pyファイルに入れることは、まったく問題ありません。あなた次第。同様のフレームワークへの明確な

1

、あなたは彼らのインポートパスによって、後でそれらを参照することができます提供(モデルクラスはしかし、一部例外あり)、プロジェクト内の任意の場所Pythonコードを置くことができます。

  1. アプリケーションが参照されていますインポートパス(またはAppConfigインポートパス)で指定します。 test.pymodels.pyを含むいくつかの魔法がありますが、ほとんどの場合、インポート/参照はかなり明示的です。
  2. ビューはurls.pyというファイルで参照されますが、通常のPythonのインポートパスとしてインポートされます。
  3. ミドルウェアは、クラス名で終わるインポートパスを示す文字列によって参照されます。
  4. 通常設定しないその他の設定も完全インポートパスです。

この明示例外です:

  1. models.py、test.py、admin.py:彼らは特別な目的を持っており、存在しない可能性があり、提供:

    1. ますあなたのアプリにモデルは一切必要なく、にAppConfig(アプリ名の代わりに)を提供します。
    2. あなたのアプリで管理クラスの自動検出に依存することはありません。
    3. あなたのアプリでテストを行いたくない場合や、アプリ固有のテストコマンドを実行するためのデフォルト以外のパスを指定する場合。
  2. テンプレートと静的ファイル:あなたのプロジェクトは、あなたの静的ファイルのために、あなたのテンプレートファイルごとのアプリローダーに依存し、最終的には、各アプリで力まかせ探索があります:彼らの内面static/templates/ディレクトリが存在する場合、これらのファイルが検索されます。

それ以外は普通のPythonコードあると、あなたが任意のビューからそれらをインポートする必要がある場合(ビューコードは、通常のPythonのimport機構を輸入しているため)、あなただけの彼らのために、通常のインポート文を実行します。

関連する問題