Lời khuyên và tính năng Django yêu thích?


308

Lấy cảm hứng từ loạt câu hỏi 'Các tính năng ẩn của ...', tôi tò mò muốn nghe về các mẹo Django yêu thích của bạn hoặc các tính năng ít được biết đến nhưng hữu ích mà bạn biết.

  • Xin vui lòng, chỉ bao gồm một mẹo cho mỗi câu trả lời.
  • Thêm yêu cầu phiên bản Django nếu có.

Câu trả lời:


221

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 '.


75
Bạn không nên hạ thấp những người trả lời câu hỏi của họ. Nó được khuyến khích, ngay cả khi nó được xác định trước.
Paolo Bergantino

19
Đây là một ý tưởng tốt mà tôi vẫn khó hiểu tại sao nó không mặc định. Có bao nhiêu người kiểm tra và triển khai trên cùng một máy?
SingleNegationElimination

19
Điều này làm giảm bớt bạn khỏi luôn gõ os.path.join () gây khó chịu khá nhanh : j = lambda filename: os.path.join(PROJECT_DIR, filename). Sau đó, bạn chỉ cần gõ j("static").
.

13
Nếu bạn đang ở trên Windows thì hãy thay thế dấu gạch chéo ngược: os.path.join (PRO DỰ_DIR, "mẫu"). Thay thế ('\', '/')
Peter Mortensen

7
Nếu bạn thực sự muốn sửa lỗi này trong Django, hãy để lại nhận xét cho code.djangoproject.com/ticket/694 yêu cầu các nhà phát triển cốt lõi xem xét lại wontfixquyết định.
sorin

128

Cài đặt phần mở rộng lệnh Djangopygraphviz 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

Thật tuyệt, không thể yêu cầu pygraphviz cài đặt chính xác trong windows, nhưng vẫn có thể chuyển đổi từ tệp chấm bằng graphviz.
monkut

Tôi thích chia sẻ sơ đồ mô hình với điều này chắc chắn là +1
BozoJoe

Có một tùy chọn svg cho điều này?
Keyo

hình ảnh đầu ra dường như được bán ngay bây giờ
Brian Wigginton

119

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.


4
@becomingGuru - nó tự động xảy ra.
Đaminh Rodger

15
Điều này là tốt, trừ khi bạn đang trả lại một số httpResponseRedirect () và một số render_to_response (). Sau đó các chuyển hướng thất bại.
Matthew Schinckel

17
Tôi không thích nó. "Rõ ràng là tốt hơn so với ngầm". Trình trang trí không cho biết chính xác khi nào nó sẽ kết xuất.
Tamás Szelei

2
@Matthew Schinckel nó thực sự không gây rối khi chuyển hướng - nếu bạn trả lại một đối tượng HttpResponse, nó sẽ chuyển nó đi mà không sửa đổi nó
Jiaaro

20
Tôi tin rằng cách tiếp cận này hiện đang dư thừa kể từ Django 1.3, xem django.shortype.render () docs.djangoproject.com/en/dev/topics/http/shortcut/#render
Dolph

101

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').


@Steef, bạn vừa tiết kiệm cho tôi vô số thời gian / đau lòng / byte, cảm ơn.
orokusaki

Thực sự tốt đẹp. Cảm ơn. Ngoài ra một kho lưu trữ các thẻ tùy chỉnh sẽ rất tuyệt để chia sẻ nội dung, bạn có nghĩ vậy không?
Leandro Ardissone

Điều đó thật tuyệt vời cho đến khi người khác phải duy trì mã của bạn. Hãy suy nghĩ: "nguyên tắc ma thuật tối thiểu"
Rich

96

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.


15
Đây là cách duy nhất để cuộn!
postfuturist

3
Bạn có thể thêm một số liên kết hướng dẫn cho virtualenv với django không?
BozoJoe

2
@BozoJoe: Làm điều này trong thiết bị đầu cuối của bạn : virtualenv myNewEnv --no-site-packages; . myNewEnv/bin/activate; pip install django; Và nó chỉ hoạt động!
SingleNegationElimination

87

Đừ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 urlthẻ .


1
Tôi đồng ý 100% về điều này. Tôi bắt đầu sử dụng các url được mã hóa cứng và nó cắn tôi trong một dự án khi tôi thay đổi định dạng url xung quanh một chút để phù hợp với một số thay đổi. Tôi đã dành thời gian để quay lại và đào bới mọi thứ và thay thế các url được mã hóa cứng. Khiếu nại lớn duy nhất của tôi là lỗi thẻ url giết chết toàn bộ trang trong khi mã hóa cứng chỉ làm rối liên kết cá nhân.
ricree

21
Đây không phải là một tính năng ẩn, đây là cách tốt nhất và cách duy nhất để bay.
Skylar Saveland

1
@skyl Đó không phải là "cách duy nhất để bay". Tôi đã ở một cuộc đua nước rút của Django và Adrian Holovaty (một trong những người tạo ra Django) nói rằng anh ta thậm chí không sử dụng urlthẻ ... 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).
TM.

bạn có thể sử dụng trong các mẫu cũng như trong {% url path.to.view.name arg1 arg2 %} docs.djangoproject.com/en/dev/ref/templates/builtins/...
SingleNegationElimination

Nếu bạn sử dụng jinja2, chỉ cần thêm reversenhư thế này environment.filters['url'] = django.core.urlresolvers.reversevà 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)
SingleNegationElimination


79

Đừ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'),
)

1
Mát mẻ! Tôi không biết rằng chúng ta có thể sử dụng lại trang đăng nhập của quản trị viên. Cảm ơn!
Joshua Partogi

66

Bộ xử lý bối cảnh là tuyệt vời.

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.pythê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_userkhóa tự động.

Cũng có tín hiệu thắ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.


4
Tín hiệu của Django là một tính năng bắt buộc đối với tôi những ngày này, khi so sánh các khung web. Viết một diễn đàn kết nối lỏng lẻo, có thể nghe, nói, cập nhật từ mô-đun "chữ ký", nhưng thực tế không yêu cầu mô-đun đó hoạt động và cũng có thể hoạt động với các mô-đun tương thích thực hiện cùng tính năng, thật tuyệt. Tôi không biết tại sao tín hiệu không được biết đến nhiều hơn và phổ biến hơn.
Lee B

Tín hiệu là rất quan trọng để tránh khớp nối chặt chẽ và lộn xộn mã nói chung nếu chúng ta sử dụng một số ứng dụng có thể tái sử dụng trong dự án của chúng tôi. Bạn đã cung cấp một ví dụ tuyệt vời cho việc ghép lỏng các ứng dụng django, +1 cho việc này.
Lukasz Korzybski

Bạn có biết nếu tín hiệu không đồng bộ?
Kedare

"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." - Đưa người dùng vào phiên . Điều đó giúp bạn tiết kiệm một cú đánh cơ sở dữ liệu cho mọi yêu cầu.
jammon

Các cuộc gọi của tín hiệu là đồng bộ. Theo tôi, một số loại cơ chế công việc không đồng bộ phù hợp hơn, giả sử, xuất bản trên Twitter / Facebook / etc (tức là - rabbitmq), vì vậy người dùng của trang web không yêu cầu.
gorsky

58

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ó !!


2
: D giống tôi! Tôi đã dành nhiều ngày để phân trang!
vikingosegundo

46

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ó.


22
Cài đặt tốt hơn ipdbvà sau đó chỉ cần gõipdb.set_trace()
Tomasz Zieliński

Hoặc sử dụng trình gỡ lỗi của Eclipse / PyDev. :-)
jMstyle

3
nhập ipdb; ipdb.set_trace () FTW!
Hassek

43

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

12
bạn có thể sử dụng bảng điều khiển và gửi email phụ trợ trong django 1.2 cho cùng một mục đích
Dmitry Shevchenko

nổi bật! hoàn hảo để đăng ký! +1
BozoJoe

3
Thay thế trong Django 1.2 với cài đặt: EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' .. điều đó sẽ in email đến manage.pyđầu ra.
vdboor

41

Từ tài liệu django-admin :

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_completiontrong bản phân phối Django. Nó cho phép hoàn thành tab django-admin.pymanage.pycác lệnh, vì vậy bạn có thể, ví dụ ...

  • Loại django-admin.py.
  • Nhấn [TAB] để xem tất cả các tùy chọn khả dụng.
  • Nhập 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.

1
Điều này hữu ích hơn tôi mong đợi. Cảm ơn!
Jeeyoung Kim

Đây là mặc định trong ít nhất là Ubuntu mới hơn. :-) Tôi đã rất ngạc nhiên khi nó lần đầu tiên xuất hiện.
odinho - Velmont

40

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.

nhập mô tả hình ảnh ở đây

Để 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_APPSbộ dữ liệu của bạn settings.pyvà 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.


37

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


13
Đây là một ơn trời. Để cung cấp thêm một chút thông tin, chỉ cần thêm thông tin này: "import pdb; pdb.set_trace ()" trên bất kỳ dòng mã nào của bạn. Làm mới trang của bạn. Nó sẽ treo. Bây giờ đi đến cửa sổ terminal của bạn, nơi bạn đang chạy máy chủ phát triển. Bây giờ nó phải là một vỏ tương tác nơi bạn có thể truy cập tất cả các biến vì chúng ở điểm đó trong mã của bạn nơi bạn dán mã gỡ lỗi.
Priestc


36

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.


Tôi cũng sử dụng và thưởng thức Jinja2, nhưng tôi đã thấy rằng có một số khớp nối với các ứng dụng "đóng góp". Đặc biệt, công cụ quản trị được gắn khá nhiều vào các mẫu Django. Ngoài ra, tôi đã phải tạo lại các trang trí đăng nhập trong contrib.auth để trở nên thân thiện với Jinja2, nhưng không quá khó.
Joe Holloway

24
Không thay thế hệ thống mẫu bằng jinja2, chỉ cần "thêm" nó, không xóa templtes django. Sử dụng Jinja2 cho quan điểm của riêng bạn và để giao diện quản trị viên tiếp tục sử dụng ngôn ngữ mẫu django.
hasen

4
Tôi đồng ý mạnh mẽ với điều này. Cú pháp hạn chế của Django là chấp nhận được, hầu hết thời gian, nhưng khi bạn nhận được đến điểm làm thẻ tùy chỉnh và tìm hiểu như thế nào khó mà thực sự là, Jinja2 là một hơi thở không khí trong lành
SingleNegationElimination

Ngoài ra, nếu bạn muốn thực hiện bất kỳ siêu lập trình nào trên nguồn mẫu, Jinja2 sẽ dễ chịu hơn nhiều, vì bạn có thể truy cập trực tiếp vào AST của các mẫu được phân tích cú pháp. Việc đi bộ AST làm cho các tác vụ như tìm ra mẫu nào mở rộng mẫu cơ sở hoặc liệt kê các biến không liên kết trong khối nguồn mẫu, hầu như rất dễ dàng.
RCoder

5
Rất may trong Django 1.2, thẻ IF thông minh hơn rất nhiều
Nixarn

35

Thêm assert Falsevào mã xem của bạn để kết xuất thông tin gỡ lỗi.


4
Tôi nghĩ khẳng định Sai là trực quan hơn = D
Jiaaro

13
nếu bạn đang chạy dự án của mình trong máy chủ django dev, hãy sử dụng mô-đun pdb của python. Đó là một cách mạnh mẽ hơn để gỡ lỗi: nhập pdb; pdb.stack_trace ()
mazelife

pdb rất hữu ích, bạn có thể sẽ hết thời gian kết nối trừ khi bạn rất nhanh trong việc gỡ lỗi.
Stephen Paulger

4
Tôi luôn luôn sử dụng 5 / 0bản thân mình. Tại sao năm? Không ý kiến.
JasonSmith

@StephenPaulger thật sao? Trình duyệt của tôi (firefox / w fireorms) có vẻ như phải chờ vài phút để phản hồi trong khi tôi gỡ lỗi.
TM.

34

Đ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>

27

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),
)

2
FWIW, các tác giả django thực sự sử dụng quan điểm đẳng cấp có trụ sở tại một vài nơi, ví dụ như contrib.formtools: code.djangoproject.com/browser/django/trunk/django/contrib/...
mazelife

3
Nếu bạn thêm một phương thức gọi, bạn có thể tạo một lớp có tên RestfulResource và sau đó yêu cầu urls.py trỏ đến các thể hiện.
Stephen Paulger

1
Các khung nhìn chung mới (Django 1.3?) Là dựa trên lớp.
gorsky

21

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_responsenhư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}
    )

Tiết kiệm hơn nữa LỘC bằng cách sử dụng trình trang trí @render_to có sẵn trong django-gây phiền nhiễu. bitbucket.org/offline/django-annoying
pithyless

6
.. hoặc sử dụng renderphương pháp phím tắt mới từ Django 1.3 ( docs.djangoproject.com/en/dev/topics/http/shortype/#render )
gorsky

20

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.


Một lưu ý có thể hoặc không thể áp dụng cho "thông báo lỗi tối nghĩa từ jinja". Đảm bảo đặt TEMPLATE_DEBUG = Sai trong settings.py. Vì một số lý do, điều này sẽ cung cấp cho bạn các lỗi có ý nghĩa từ các mẫu Jinja.
Carl G

19

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 %}

4
FYI, đối với bất kỳ ai sử dụng Jinja2 thay vì mẫu Django, bạn có thể thực hiện: {{lipum (5)}}
Joe Holloway


19

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.


6
Tôi sử dụng điều này trong chế độ dev và để đảm bảo rằng tôi không quên tắt nó trong sản xuất, tôi gói quy tắc URL đó trong một DEBUG chỉ có điều kiện.
sghael

18

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?).


7
Nếu một từ khóa "as" có thể được sử dụng với thẻ mẫu phụ thuộc vào thẻ cụ thể này. Nó không được định nghĩa bởi chính django mà bởi các thẻ đơn, tùy thuộc vào ý nghĩa của chúng. Hãy xem thẻ url được đề cập để xem cách "as" được sử dụng: code.djangoproject.com/browser/django/trunk/django/template/
vikingosegundo

16

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.


1
Bạn có thể tìm thấy phiên bản mới của chương sách về Chế độ xem chung trên djangobook.com/en/2.0/ch CHƯƠNG11 . Một trong những bình luận đi đến phiên bản Django pre-1.0 của cuốn sách (cuốn Django 1.0)
Esteban Küber


14

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ỏ)


dự án thú vị, giữ cho nó lên!
Serge Golovov

Cảm ơn, nó khá tiện dụng :-)
godswearhats

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.