回答:
私は自分からのヒントから始めます:)
ハードコーディングされたディレクトリ名を回避するには、settings.pyでos.path.dirname()を使用します。
別の場所でプロジェクトを実行する場合は、settings.pyにパスをハードコードしないでください。テンプレートと静的ファイルがDjangoプロジェクトディレクトリ内にある場合は、settings.pyで次のコードを使用します。
# settings.py
import os
PROJECT_DIR = os.path.dirname(__file__)
...
STATIC_DOC_ROOT = os.path.join(PROJECT_DIR, "static")
...
TEMPLATE_DIRS = (
os.path.join(PROJECT_DIR, "templates"),
)
クレジット:このヒントは、スクリーンキャスト「Django From the Ground Up」から入手しました。
j = lambda filename: os.path.join(PROJECT_DIR, filename)
。次に、単に入力する必要がありますj("static")
。
Django Command Extensionsとpygraphvizをインストールし、次のコマンドを発行して、見栄えの良いDjangoモデルの視覚化を取得します。
./manage.py graph_models -a -g -o my_project.png
の代わりにdjango-annoyingの render_to
デコレータを使用してくださいrender_to_response
。
@render_to('template.html')
def foo(request):
bars = Bar.objects.all()
if request.user.is_authenticated():
return HttpResponseRedirect("/some/url/")
else:
return {'bars': bars}
# equals to
def foo(request):
bars = Bar.objects.all()
if request.user.is_authenticated():
return HttpResponseRedirect("/some/url/")
else:
return render_to_response('template.html',
{'bars': bars},
context_instance=RequestContext(request))
HttpResponse(リダイレクトなど)を返すとデコレーターが短絡し、期待どおりに機能することを指摘するように編集しました。
サイトのテンプレート全体で使用する一連のカスタムタグがあります。それをオートロードする方法を探していましたが(DRY、覚えていますか?)、次のことがわかりました
from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')
これをデフォルトでロードされるモジュール(たとえば、メインのurlconf)に配置すると、カスタムタグモジュールのタグとフィルターを、を使用せずに、どのテンプレートでも使用できるようになります{% load custom_tag_module %}
。
に渡される引数は、template.add_to_builtins()
任意のモジュールパスにすることができます。カスタムタグモジュールは、特定のアプリケーションに存在する必要はありません。たとえば、プロジェクトのルートディレクトリ(例:)のモジュールにすることもできます'project.custom_tag_module'
。
Virtualenv + Python =複数のDjangoプロジェクトで作業していて、それらすべてが同じバージョンのDjango / anアプリケーションに依存していない可能性がある場合のライフセーバー。
virtualenv myNewEnv --no-site-packages
; . myNewEnv/bin/activate
; pip install django
; そしてそれはうまくいきます!
URLをハードコーディングしないでください。
代わりにURL名を使用し、reverse
関数を使用してURL自体を取得します。
URLマッピングを定義するときに、URLに名前を付けます。
urlpatterns += ('project.application.views'
url( r'^something/$', 'view_function', name="url-name" ),
....
)
名前がURLごとに一意であることを確認してください。
私は通常、一貫した形式の「project-appplication-view」を持っています。たとえば、スレッドビューの場合は「cbx-forum-thread」です。
更新(ayazの追加を恥知らずに盗む):
この名前は、url
タグが付いたテンプレートで使用できます。
url
タグも使用しないと言っていました...彼のスタンスは、URLはとにかく変更されるべきではないということです(あなたがユーザー)。
{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/…の
reverse
ように追加するだけenvironment.filters['url'] = django.core.urlresolvers.reverse
で、テンプレートで使用できます{{ 'view-name'|url(arg1, arg2)|e }}
(HTMLに含めるために一部の文字をエスケープするには、「e」が必要です)
djangoデバッグツールバーを使用します。たとえば、ビューのレンダリング中に実行されたすべてのSQLクエリを表示でき、それらのいずれかのスタックトレースを表示することもできます。
独自のログインページを作成しないでください。django.contrib.authを使用している場合。
実際の汚い秘密は、django.contrib.adminも使用していて、django.template.loaders.app_directories.load_template_sourceがテンプレートローダーにある 場合、テンプレートを無料で入手できることです!
# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
(r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
(r'^accounts/logout/$','views.logout'),
)
異なるユーザーモデルがあり、それをすべての応答に含めたいとします。これを行う代わりに:
def myview(request, arg, arg2=None, template='my/template.html'):
''' My view... '''
response = dict()
myuser = MyUser.objects.get(user=request.user)
response['my_user'] = myuser
...
return render_to_response(template,
response,
context_instance=RequestContext(request))
コンテキストプロセスでは、変数をテンプレートに渡すことができます。私は通常私に入れ'my_project/apps/core/context.py
ます:
def my_context(request):
try:
return dict(my_user=MyUser.objects.get(user=request.user))
except ObjectNotFound:
return dict(my_user='')
あなたにあなたsettings.py
に次の行を追加してくださいTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
これで、リクエストが行われるたびに、my_user
キーが自動的に含まれます。
数か月前にこれについてブログ投稿を書いたので、カットアンドペーストするだけです。
箱から出してすぐに、Djangoは非常に役立ついくつかのシグナルを提供します。保存前、保存後、初期化、削除のほか、リクエストが処理されているときにも行うことができます。それでは、概念から離れて、これらがどのように使用されるかを示しましょう。ブログがあるとしましょう
from django.utils.translation import ugettext_lazy as _
class Post(models.Model):
title = models.CharField(_('title'), max_length=255)
body = models.TextField(_('body'))
created = models.DateTimeField(auto_now_add=True)
したがって、どういうわけか、新しい投稿を作成した多くのブログpingサービスの1つに通知し、最新の投稿キャッシュを再構築して、それについてツイートする必要があります。シグナルがあれば、Postクラスにメソッドを追加しなくても、これらすべてを実行できます。
import twitter
from django.core.cache import cache
from django.db.models.signals import post_save
from django.conf import settings
def posted_blog(sender, created=None, instance=None, **kwargs):
''' Listens for a blog post to save and alerts some services. '''
if (created and instance is not None):
tweet = 'New blog post! %s' instance.title
t = twitter.PostUpdate(settings.TWITTER_USER,
settings.TWITTER_PASSWD,
tweet)
cache.set(instance.cache_key, instance, 60*5)
# send pingbacks
# ...
# whatever else
else:
cache.delete(instance.cache_key)
post_save.connect(posted_blog, sender=Post)
それでは、その関数を定義し、post_init信号を使用して関数をPostモデルに接続し、保存後に実行します。
私が始めたとき、私はページネーターがいることを知りませんでした、その存在を知っていることを確認してください!!
IPythonを使用して、任意のレベルでコードにジャンプし、IPythonの機能を使用してデバッグします。IPythonをインストールしたら、このコードをデバッグしたい場所に配置します。
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
次に、ページを更新し、runserverウィンドウに移動すると、インタラクティブなIPythonウィンドウが表示されます。
TextMateでスニペットを設定したので、ipshellと入力してタブを押します。それなしでは生きられなかった。
ipdb
してから入力するだけipdb.set_trace()
送信されたものを出力するだけの開発SMTPサーバーを実行します(実際に開発サーバーにSMTPをインストールしたくない場合)。
コマンドライン:
python -m smtpd -n -c DebuggingServer localhost:1025
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
..メールをmanage.py
出力に出力します。
Bashシェルを使用する場合extras/django_bash_completion
は、Djangoディストリビューションに含まれているDjango bash完了スクリプトのインストールを検討してください。django-admin.py
とmanage.py
コマンドのタブ補完が可能になるので、たとえば...
django-admin.py
ます。sql
から[TAB]と入力すると、名前がで始まるすべての使用可能なオプションが表示されますsql
。./manage.py runserver_plus
付属していますfacilty django_extensionsは本当に素晴らしいです。
それは、とりわけ、Werkzeugデバッガーを使用してスタック内の各ポイントのインタラクティブなデバッグコンソールを作成する拡張デバッグページを作成します(スクリーンショットを参照)。またdump()
、オブジェクト/フレームに関する情報を表示するための非常に便利なデバッグ方法も提供します。
インストールするには、pipを使用できます。
pip install django_extensions
pip install Werkzeug
その後、追加'django_extensions'
あなたのINSTALLED_APPS
中にタプルsettings.py
と新しい拡張子を持つ開発サーバーを起動します。
./manage.py runserver_plus
これにより、デバッグ方法が変わります。
私はPythonデバッガーpdbを使用してDjangoプロジェクトをデバッグするのが好きです。
これは、それを使用する方法を学ぶのに役立つリンクです:http : //www.ferg.org/papers/debugging_in_python.html
Djangoと他のアプリケーションの間でデータを交換しようとするときrequest.raw_post_data
は、良い友達です。たとえば、XMLデータを受け取ってカスタム処理するために使用します。
ドキュメント:http : //docs.djangoproject.com/en/dev/ref/request-response/
Djangoテンプレート言語が非常に制限されている(私のように!)とわかった場合、その言語にこだわる必要はありません。Djangoは柔軟性が高く、テンプレート言語はシステムの他の部分と疎結合されているため、別のテンプレート言語をプラグインし、それを使用してhttp応答をレンダリングするだけです!
私はJinja2を使用しています。これは、djangoテンプレート言語のパワーアップバージョンとほとんど同じです。同じ構文を使用し、ifステートメントで式を使用できます。if_item_in_list
!などのカスタムifタグを作成する必要はありません。あなたは単に%{ if item in list %}
、または言うことができます{% if object.field < 10 %}
。
しかし、それだけではありません。テンプレートの作成を容易にするための機能が他にもたくさんあるので、ここではすべてを説明することはできません。
assert False
ビューコードにデバッグ情報をダンプするために追加します。
5 / 0
自分を使います。なぜ5つ?わからない
これにより、Django URL名とリバースURLディスパッチに関する上記の返信に追加されます。
URL名はテンプレート内でも効果的に使用できます。たとえば、特定のURLパターンの場合:
url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')
テンプレートには次のものを含めることができます。
<a href="{% url project_team project.id %}">Team</a>
Djangoの「ビュー」はHttpResponseを返す呼び出し可能オブジェクトである必要があるだけなので、Ruby on Railsやその他のフレームワークのようなクラスベースのビューを簡単に作成できます。
クラスベースのビューを作成するにはいくつかの方法がありますが、これが私のお気に入りです。
from django import http
class RestView(object):
methods = ('GET', 'HEAD')
@classmethod
def dispatch(cls, request, *args, **kwargs):
resource = cls()
if request.method.lower() not in (method.lower() for method in resource.methods):
return http.HttpResponseNotAllowed(resource.methods)
try:
method = getattr(resource, request.method.lower())
except AttributeError:
raise Exception("View method `%s` does not exist." % request.method.lower())
if not callable(method):
raise Exception("View method `%s` is not callable." % request.method.lower())
return method(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
return http.HttpResponse()
def head(self, request, *args, **kwargs):
response = self.get(request, *args, **kwargs)
response.content = ''
return response
条件付きリクエストの処理や承認など、他のあらゆる種類のものをベースビューに追加できます。
ビューを設定すると、urls.pyは次のようになります。
from django.conf.urls.defaults import *
from views import MyRestView
urlpatterns = patterns('',
(r'^restview/', MyRestView.dispatch),
)
を使用render_to_response
してコンテキストをテンプレートにバインドしてレンダリングする代わりに(Djangoのドキュメントで通常表示される)、汎用ビューを使用しますdirect_to_template
。これは同じことをrender_to_response
行いますが、自動的にRequestContextをテンプレートコンテキストに追加し、暗黙的にコンテキストプロセッサを使用できるようにします。これはを使用して手動で実行できますrender_to_response
が、なぜわざわざ行うのですか?これは、覚えておくべきもう1つのステップであり、LOCです。コンテキストプロセッサを利用する以外に、テンプレートにRequestContextを含めると、次のようなことが可能になります。
<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a>
これは非常に便利です。実際、一般的なビューでは一般的に+1です。Djangoのドキュメントでは、ほとんどの場合、簡単なアプリ用のviews.pyファイルがない場合のショートカットとしても表示されますが、独自のビュー関数内で使用することもできます。
from django.views.generic import simple
def article_detail(request, slug=None):
article = get_object_or_404(Article, slug=slug)
return simple.direct_to_template(request,
template="articles/article_detail.html",
extra_context={'article': article}
)
render
1.3(ジャンゴからショートカット方法をdocs.djangoproject.com/en/dev/topics/http/shortcuts/#render)
ウェブデザインのアプリは、あなたのウェブサイトを設計し始めたときに非常に便利です。インポートしたら、これを追加してサンプルテキストを生成できます。
{% load webdesign %}
{% lorem 5 p %}
django.db.models.get_model
インポートせずにモデルを取得できます。
それがいかに便利なジェームズ・ショー:「Djangoのヒント:書き込みより良いテンプレートタグ-反復4」。
「manage.py runserver」で実行できる開発サーバーがあることは誰もが知っていますが、静的ファイル(CSS / JS / IMG)を提供するための開発ビューもあることを知っていますか?
Djangoには静的ファイルを提供する方法がまったくないため、新参者は常に困惑しています。これは、開発チームが実際のWebサーバーの仕事だと考えているためです。
しかし、開発時には、Apache + mod_wisgiを設定したくない場合があります。次に、以下をurls.pyに追加するだけです。
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
CSS / JS / IMGはwww.yoursite.com/site_media/で入手できます。
もちろん、本番環境では使用しないでください。
これはsorl-thumbnailsアプリのドキュメントから学びました。テンプレートタグで「as」キーワードを使用して、呼び出しの結果をテンプレートの他の場所で使用できます。
例えば:
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
これは、Djangoテンプレートタグのドキュメントで渡されるときに言及されていますが、ループにのみ言及しています。他の場所(どこでも?)でもこれを使用できることを彼らは呼びかけていません。
django.views.generic.list_detail.object_list-ページネーション用のすべてのロジックとテンプレート変数を提供します(私が何千回も書いたものの1つです)。 それをラップすると、必要なロジックが可能になります。このgemにより、「検索結果」ページでの1つ前のエラーのデバッグに何時間も節約でき、ビューコードがその過程できれいになります。
PyCharm IDEは、Djangoのサポートが組み込まれているため、コーディング、特にデバッグに適した環境です。
使用はxml_models(代わりに、SQLの1の)XML REST APIのバックエンドを使用Djangoのモデルを作成します。これは、サードパーティのAPIをモデリングする場合に特に便利です。これまでと同じクエリセット構文をすべて使用できます。PyPIからインストールできます。
APIからのXML:
<profile id=4>
<email>joe@example.com</email>
<first_name>Joe</first_name>
<last_name>Example</last_name>
<date_of_birth>1975-05-15</date_of_birth>
</profile>
そして今Pythonで:
class Profile(xml_models.Model):
user_id = xml_models.IntField(xpath='/profile/@id')
email = xml_models.CharField(xpath='/profile/email')
first = xml_models.CharField(xpath='/profile/first_name')
last = xml_models.CharField(xpath='/profile/last_name')
birthday = xml_models.DateField(xpath='/profile/date_of_birth')
finders = {
(user_id,): settings.API_URL +'/api/v1/profile/userid/%s',
(email,): settings.API_URL +'/api/v1/profile/email/%s',
}
profile = Profile.objects.get(user_id=4)
print profile.email
# would print 'joe@example.com'
リレーションシップとコレクションも処理できます。頻繁に使用される製品コードで毎日使用しているため、ベータ版ですが非常に使用可能です。また、テストで使用できる適切なスタブのセットもあります。
(免責事項:私はこのライブラリの作成者ではありませんが、私はコミッターになり、いくつかのマイナーなコミットを行いました)