Câu trả lời:
Tôi sẽ bắt đầu với một mẹo từ bản thân mình :)
Sử dụng os.path.dirname () trong settings.py để tránh các tên miền được mã hóa cứng.
Không có đường dẫn mã cứng trong cài đặt của bạn nếu bạn muốn chạy dự án của mình ở các vị trí khác nhau. Sử dụng mã sau đây trong settings.txt nếu các mẫu và tệp tĩnh của bạn nằm trong thư mục dự án Django:
# 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"),
)
Tín dụng: Tôi đã nhận được mẹo này từ screencast ' Django từ mặt đất lên '.
j = lambda filename: os.path.join(PROJECT_DIR, filename)
. Sau đó, bạn chỉ cần gõ j("static")
.
wontfix
quyết định.
Cài đặt phần mở rộng lệnh Django và pygraphviz và sau đó đưa ra lệnh sau để có được hình ảnh mô hình Django thực sự đẹp mắt:
./manage.py graph_models -a -g -o my_project.png
Sử dụng trang trí django-gây phiền nhiễu render_to
thay vì 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))
Đã chỉnh sửa để chỉ ra rằng việc trả lại một HTTPResponse (chẳng hạn như chuyển hướng) sẽ làm chập mạch trang trí và hoạt động như bạn mong đợi.
Có một bộ thẻ tùy chỉnh tôi sử dụng trên tất cả các mẫu trang web của mình. Tìm cách để tự động tải nó (DRY, nhớ không?), Tôi tìm thấy như sau:
from django import template
template.add_to_builtins('project.app.templatetags.custom_tag_module')
Nếu bạn đặt cái này trong một mô-đun được tải theo mặc định (ví dụ url url chính của bạn), bạn sẽ có các thẻ và bộ lọc từ mô-đun thẻ tùy chỉnh có sẵn trong bất kỳ mẫu nào mà không cần sử dụng {% load custom_tag_module %}
.
Đối số được truyền vào template.add_to_builtins()
có thể là bất kỳ đường dẫn mô-đun nào; mô-đun thẻ tùy chỉnh của bạn không phải sống trong một ứng dụng cụ thể. Ví dụ, nó cũng có thể là một mô-đun trong thư mục gốc của dự án của bạn (ví dụ. 'project.custom_tag_module'
).
Virtualenv + Python = trình cứu sinh nếu bạn đang làm việc trên nhiều dự án Django và có khả năng tất cả chúng đều không phụ thuộc vào cùng một phiên bản Django / một ứng dụng.
virtualenv myNewEnv --no-site-packages
; . myNewEnv/bin/activate
; pip install django
; Và nó chỉ hoạt động!
Đừng mã hóa URL của bạn!
Sử dụng tên url thay thế vàreverse
chức năng để lấy URL.
Khi bạn xác định ánh xạ URL, hãy đặt tên cho URL của bạn.
urlpatterns += ('project.application.views'
url( r'^something/$', 'view_function', name="url-name" ),
....
)
Đảm bảo tên là duy nhất cho mỗi URL.
Tôi thường có một định dạng nhất quán "dự án ứng dụng-xem", ví dụ "cbx-forum-thread" cho chế độ xem chủ đề.
CẬP NHẬT (không biết xấu hổ ăn cắp bổ sung của ayaz ):
Tên này có thể được sử dụng trong các mẫu với url
thẻ .
url
thẻ ... Quan điểm của anh ta là các url không nên thay đổi (nếu bạn muốn thân thiện với bạn người dùng).
{% url path.to.view.name arg1 arg2 %}
docs.djangoproject.com/en/dev/ref/templates/builtins/...
reverse
như thế này environment.filters['url'] = django.core.urlresolvers.reverse
và bạn có thể sử dụng nó trong các mẫu của mình như vậy: {{ 'view-name'|url(arg1, arg2)|e }}
("e" là cần thiết để thoát một số ký tự để đưa vào HTML)
Sử dụng thanh công cụ gỡ lỗi django . Ví dụ: nó cho phép xem tất cả các truy vấn SQL được thực hiện trong khi hiển thị chế độ xem và bạn cũng có thể xem stacktrace cho bất kỳ trong số chúng.
Đừng viết các trang đăng nhập của riêng bạn. Nếu bạn đang sử dụng django.contrib.auth.
Bí mật thực sự, bẩn thỉu là nếu bạn cũng đang sử dụng django.contrib.admin và django.template.loaders.app_directories.load_template_source nằm trong trình tải mẫu của bạn, bạn cũng có thể nhận được các mẫu miễn phí!
# somewhere in urls.py
urlpatterns += patterns('django.contrib.auth',
(r'^accounts/login/$','views.login', {'template_name': 'admin/login.html'}),
(r'^accounts/logout/$','views.logout'),
)
Giả sử bạn có một mô hình người dùng khác và bạn muốn đưa nó vào mọi phản hồi. Thay vì làm điều này:
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))
Các quy trình bối cảnh cung cấp cho bạn khả năng chuyển bất kỳ biến nào cho các mẫu của bạn. Tôi thường đặt của tôi vào '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='')
Trong dòng của bạn settings.py
thêm dòng sau vàoTEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS = (
'my_project.apps.core.context.my_context',
...
)
Bây giờ mỗi khi một yêu cầu được thực hiện, nó sẽ bao gồm my_user
khóa tự động.
Tôi đã viết một bài đăng trên blog về điều này một vài tháng trước vì vậy tôi sẽ cắt và dán:
Django cung cấp cho bạn một số tín hiệu cực kỳ hữu ích. Bạn có khả năng thực hiện mọi việc trước và đăng lưu, init, xóa hoặc ngay cả khi yêu cầu đang được xử lý. Vì vậy, hãy thoát khỏi các khái niệm và chứng minh làm thế nào chúng được sử dụng. Nói rằng chúng tôi đã có một blog
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)
Vì vậy, bằng cách nào đó bạn muốn thông báo cho một trong nhiều dịch vụ tạo blog mà chúng tôi đã tạo một bài đăng mới, xây dựng lại bộ nhớ cache bài đăng gần đây nhất và tweet về nó. Vâng, với các tín hiệu bạn có khả năng thực hiện tất cả điều này mà không cần phải thêm bất kỳ phương thức nào vào lớp 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)
Ở đó chúng ta đi, bằng cách xác định hàm đó và sử dụng tín hiệu post_init để kết nối hàm với mô hình Post và thực hiện nó sau khi nó được lưu.
Khi tôi bắt đầu, tôi không biết rằng có một Paginator , hãy chắc chắn rằng bạn biết về sự tồn tại của nó !!
Sử dụng IPython để nhảy vào mã của bạn ở mọi cấp độ và gỡ lỗi bằng sức mạnh của IPython. Khi bạn đã cài đặt IPython, chỉ cần đặt mã này vào bất cứ nơi nào bạn muốn gỡ lỗi:
from IPython.Shell import IPShellEmbed; IPShellEmbed()()
Sau đó, làm mới trang, đi đến cửa sổ máy chủ của bạn và bạn sẽ ở trong cửa sổ IPython tương tác.
Tôi có một đoạn mã được thiết lập trong TextMate vì vậy tôi chỉ cần gõ ipshell và nhấn tab. Tôi không thể sống mà không có nó.
ipdb
và sau đó chỉ cần gõipdb.set_trace()
Chạy một máy chủ SMTP phát triển sẽ chỉ xuất ra bất cứ thứ gì được gửi đến nó (nếu bạn không thực sự muốn cài đặt SMTP trên máy chủ dev của mình.)
dòng lệnh:
python -m smtpd -n -c DebuggingServer localhost:1025
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
.. điều đó sẽ in email đến manage.py
đầu ra.
Nếu bạn sử dụng shell Bash, hãy xem xét việc cài đặt tập lệnh hoàn thành bash Django, nằm extras/django_bash_completion
trong bản phân phối Django. Nó cho phép hoàn thành tab django-admin.py
và manage.py
các lệnh, vì vậy bạn có thể, ví dụ ...
django-admin.py
.sql
, sau đó [TAB], để xem tất cả các tùy chọn khả dụng có tên bắt đầu bằng sql
.Sự thuận tiện ./manage.py runserver_plus
đi kèm với django_extensions thực sự tuyệt vời.
Nó tạo ra một trang gỡ lỗi nâng cao, trong số những thứ khác, sử dụng trình gỡ lỗi Werkzeug để tạo các bảng gỡ lỗi tương tác cho từng điểm trong ngăn xếp (xem ảnh chụp màn hình). Nó cũng cung cấp một phương pháp gỡ lỗi tiện lợi rất hữu ích dump()
để hiển thị thông tin về một đối tượng / khung.
Để cài đặt, bạn có thể sử dụng pip:
pip install django_extensions
pip install Werkzeug
Sau đó thêm 'django_extensions'
vào INSTALLED_APPS
bộ dữ liệu của bạn settings.py
và khởi động máy chủ phát triển với tiện ích mở rộng mới:
./manage.py runserver_plus
Điều này sẽ thay đổi cách bạn gỡ lỗi.
Tôi thích sử dụng trình gỡ lỗi Python pdb để gỡ lỗi các dự án Django.
Đây là một liên kết hữu ích để tìm hiểu cách sử dụng nó: http://www.ferg.org/ con/debugging_in_python.html
Khi cố gắng trao đổi dữ liệu giữa Django và một ứng dụng khác, request.raw_post_data
là một người bạn tốt. Sử dụng nó để nhận và xử lý tùy chỉnh dữ liệu XML.
Tài liệu: http://docs.djangoproject.com/en/dev/ref/request-response/
Sử dụng Jinja2 cùng với Django.
Nếu bạn thấy ngôn ngữ mẫu Django cực kỳ hạn chế (như tôi!) Thì bạn không cần phải bị mắc kẹt với nó. Django rất linh hoạt và ngôn ngữ mẫu được kết nối lỏng lẻo với phần còn lại của hệ thống, vì vậy chỉ cần cắm vào một ngôn ngữ mẫu khác và sử dụng nó để hiển thị các phản hồi http của bạn!
Tôi sử dụng Jinja2 , nó gần giống như một phiên bản được hỗ trợ của ngôn ngữ mẫu django, nó sử dụng cùng một cú pháp và cho phép bạn sử dụng các biểu thức trong câu lệnh if! không còn tạo một if-tags tùy chỉnh như if_item_in_list
! bạn có thể nói một cách đơn giản %{ if item in list %}
, hoặc {% if object.field < 10 %}
.
Nhưng đó không phải là tất cả; nó có nhiều tính năng hơn để dễ dàng tạo mẫu, mà tôi không thể đi qua mặc dù tất cả chúng ở đây.
Thêm assert False
vào mã xem của bạn để kết xuất thông tin gỡ lỗi.
5 / 0
bản thân mình. Tại sao năm? Không ý kiến.
Điều này thêm vào câu trả lời ở trên về tên URL Django và gửi URL ngược .
Tên URL cũng có thể được sử dụng hiệu quả trong các mẫu. Ví dụ: đối với mẫu URL đã cho:
url(r'(?P<project_id>\d+)/team/$', 'project_team', name='project_team')
bạn có thể có các mẫu sau:
<a href="{% url project_team project.id %}">Team</a>
Vì Django "lượt xem" chỉ cần là các cuộc gọi có thể trả về một HTTPResponse, nên bạn có thể dễ dàng tạo các chế độ xem dựa trên lớp như các chế độ xem trong Ruby on Rails và các khung công tác khác.
Có một số cách để tạo các chế độ xem dựa trên lớp, đây là mục ưa thích của tôi:
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
Bạn có thể thêm tất cả các loại nội dung khác như xử lý và ủy quyền yêu cầu có điều kiện trong chế độ xem cơ sở của bạn.
Khi bạn đã thiết lập chế độ xem của mình, urls.py sẽ trông giống như thế này:
from django.conf.urls.defaults import *
from views import MyRestView
urlpatterns = patterns('',
(r'^restview/', MyRestView.dispatch),
)
Thay vì sử dụng render_to_response
để liên kết ngữ cảnh của bạn với một mẫu và hiển thị nó (đó là những gì các tài liệu Django thường hiển thị) sử dụng chế độ xem chung direct_to_template
. Nó cũng làm điều tương tự render_to_response
nhưng nó cũng tự động thêm RequestContext vào bối cảnh mẫu, ngầm cho phép sử dụng bộ xử lý bối cảnh. Bạn có thể làm điều này bằng tay bằng cách sử dụng render_to_response
, nhưng tại sao phải bận tâm? Đó chỉ là một bước để nhớ và một LỘC khác. Bên cạnh việc sử dụng các bộ xử lý bối cảnh, việc có RequestContext trong mẫu của bạn cho phép bạn thực hiện những việc như:
<a href="{{MEDIA_URL}}images/frog.jpg">A frog</a>
Điều này rất hữu ích. Trong thực tế, +1 về quan điểm chung nói chung. Các tài liệu Django chủ yếu hiển thị chúng dưới dạng các phím tắt thậm chí không có tệp view.py cho các ứng dụng đơn giản, nhưng bạn cũng có thể sử dụng chúng trong các chức năng xem của riêng mình:
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
phương pháp phím tắt mới từ Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortype/#render )
Tôi không đủ uy tín để trả lời nhận xét trong câu hỏi, nhưng điều quan trọng cần lưu ý là nếu bạn sẽ sử dụng Jinja , thì nó không hỗ trợ ký tự '-' trong tên khối mẫu, trong khi Django thì có. Điều này gây ra cho tôi rất nhiều vấn đề và lãng phí thời gian để cố gắng theo dõi thông báo lỗi rất khó hiểu mà nó tạo ra.
Các ứng dụng webdesign là rất hữu ích khi bắt đầu thiết kế trang web của bạn. Sau khi nhập, bạn có thể thêm phần này để tạo văn bản mẫu:
{% load webdesign %}
{% lorem 5 p %}
django.db.models.get_model
không cho phép bạn lấy một mô hình mà không cần nhập nó.
James cho thấy mức độ tiện dụng của nó: "Mẹo Django: Viết thẻ mẫu tốt hơn - Lặp lại 4" .
Mọi người đều biết có một máy chủ phát triển mà bạn có thể chạy với "Manage.txt ranerver", nhưng bạn có biết rằng có một chế độ xem phát triển để phục vụ các tệp tĩnh (CSS / JS / IMG) không?
Những người mới đến luôn bối rối vì Django không đi kèm với bất kỳ cách nào để phục vụ các tệp tĩnh. Điều này là do nhóm dev nghĩ rằng đó là công việc cho một máy chủ Web ngoài đời thực.
Nhưng khi phát triển, bạn có thể không muốn thiết lập Apache + mod_wisgi, điều đó thật nặng nề. Sau đó, bạn chỉ có thể thêm các mục sau vào url:
(r'^site_media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': '/path/to/media'}),
CSS / JS / IMG của bạn sẽ có sẵn tại www.yoursite.com/site_media/.
Tất nhiên, không sử dụng nó trong môi trường sản xuất.
Tôi đã học cái này từ tài liệu cho hình thu nhỏ ứng dụng . Bạn có thể sử dụng từ khóa "dưới dạng" trong thẻ mẫu để sử dụng kết quả của cuộc gọi ở nơi khác trong mẫu của mình.
Ví dụ:
{% url image-processor uid as img_src %}
<img src="{% thumbnail img_src 100x100 %}"/>
Điều này được đề cập trong việc chuyển qua tài liệu templatetag của Django, nhưng chỉ liên quan đến các vòng lặp. Họ không gọi rằng bạn cũng có thể sử dụng nó ở bất cứ đâu (bất cứ nơi nào?).
django.view.generic.list_detail.object_list - Nó cung cấp tất cả các biến logic & khuôn mẫu để phân trang (một trong những bài viết mà tôi đã viết hàng nghìn lần). Gói nó cho phép bất kỳ logic bạn cần. Viên ngọc này đã tiết kiệm cho tôi nhiều giờ để sửa lỗi từng lỗi trong các trang "Kết quả tìm kiếm" của tôi và làm cho mã xem sạch hơn trong quy trình.
PyCharm IDE là một môi trường tốt để viết mã và đặc biệt là gỡ lỗi, với sự hỗ trợ tích hợp cho Django.
Sử dụng xml_models để tạo các mô hình Django sử dụng phụ trợ API REST của XML (thay vì SQL). Điều này rất hữu ích, đặc biệt là khi lập mô hình API của bên thứ ba - bạn nhận được tất cả cú pháp Truy vấn giống như bạn đã sử dụng. Bạn có thể cài đặt nó từ PyPI.
XML từ một API:
<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>
Và bây giờ trong 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'
Nó cũng có thể xử lý các mối quan hệ và bộ sưu tập. Chúng tôi sử dụng nó mỗi ngày trong mã sản xuất được sử dụng nhiều, vì vậy mặc dù bản beta này rất có thể sử dụng được. Nó cũng có một bộ sơ khai tốt mà bạn có thể sử dụng trong các bài kiểm tra của mình.
(Tuyên bố miễn trừ trách nhiệm: trong khi tôi không phải là tác giả của thư viện này, bây giờ tôi là một người đi làm, đã thực hiện một vài cam kết nhỏ)