2015-12-16 13 views
5

Tôi đang tự mình học Django và tôi dường như không nhận được manh mối về nơi tôi triển khai một lớp Python thông thường. Ý tôi là, tôi không biết các lớp Python mà tôi viết đi đâu. Giống như họ đi vào một tệp riêng biệt và sau đó được nhập vào views.py hoặc là các lớp được triển khai bên trong tệp views.py?Nơi triển khai các lớp python ở Django?

Ví dụ tôi muốn triển khai Class Alphabet, tôi có nên thực hiện điều này trong một tệp riêng biệt bên trong mô-đun hoặc chỉ triển khai các hàm bên trong tệp views.py không?

+4

Bất cứ nơi nào bạn muốn, nó chỉ là Python. – davidism

+2

Đặt nó bất cứ nơi nào django sẽ tìm thấy nó. Tôi thường có một mô-đun utils cho các tiện ích đa năng. – fiacre

+0

Cảm ơn bạn đã trả lời! Nhưng nếu tôi đặt nó vào một tệp riêng biệt và sau đó nhập nó, làm cách nào để in các thuộc tính trong một mẫu HTML? Tôi biết rằng thông qua các hàm trong views.py tôi phải trả về yêu cầu và tên mẫu. Tuy nhiên, tôi dường như không thể "chuyển" thuộc tính của tôi đến trang mẫu. – Silvestrini

Trả lời

4

Tôi không biết các lớp Python tôi viết ở đâu. Giống như họ truy cập vào một tệp riêng biệt và sau đó được nhập vào views.py. Ví dụ tôi muốn triển khai Bảng chữ cái lớp.

Nó chỉ là một vấn đề nhận được tuyên bố nhập khẩu của bạn chính xác:

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

Sau đó, theo quan điểm của bạn:

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

Hoặc, bạn có thể làm điều đó như thế này:

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

Và trong chế độ xem của bạn:

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

đáp ứng để bình luận:

Và sau khi tôi nhập thành công lớp học của tôi, làm thế nào để tôi vượt qua thuộc tính cho một mẫu HTML?

Dưới đây là trực tiếp từ số django tutorial chính thức.

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

Các directory structure trông như thế này:

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

myapp/templates/myapp/index.html:

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

myapp/myclasses.py:

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

Bắt đầu máy chủ:

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

url trong trình duyệt của bạn:

http://localhost:8000/myapp/ 

Bạn sẽ thấy:

Kết quả mà bạn yêu cầu là: helloZ

Nếu bạn nhận xét ra dòng sau trong myapp/views.py:

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

Sau đó mẫu sẽ gửi phần else của index.html cho trình duyệt:

Rất tiếc, không thể nhận kết quả.

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

Và sau khi tôi đã nhập thành công lớp học của mình, làm cách nào để chuyển các thuộc tính vào một mẫu HTML? Tôi có trả về một đối tượng của lớp được tạo trong views.py với render() hoặc render_to_response không? – Silvestrini

+0

Kiểm tra câu trả lời của tôi để biết cách thực hiện điều này –

+0

@Silvestrini, Xem câu trả lời của tôi ở cuối câu trả lời của tôi. – 7stud

3

Django chỉ là Python vào cuối ngày .

Bạn có thể tạo mô-đun mới ở bất kỳ đâu trong dự án của mình và nhập chúng vào chế độ xem, mô hình, url, v.v. Đây thường là cách bạn tổ chức utils chung (utils.py).

Bạn có thể cung cấp dữ liệu để quan điểm của bạn trong một vài cách khác nhau, ví dụ:

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 

Và trong some_template.html: {{ my_data }}

1

Nó phụ thuộc vào phạm vi của lớp Alphabet. Nếu nó là một lớp tiện ích thì tôi sẽ đề nghị đưa vào một tệp utils.py, ví dụ. Nhưng nó hoàn toàn tốt để có các lớp trong tệp views.py, chủ yếu là các lớp xử lý giao diện người dùng. Tùy thuộc vào bạn.

1

biệt để khuôn khổ tương tự, bạn có thể đặt mã Python của bạn bất cứ nơi nào trong dự án của bạn, miễn là bạn có thể tham khảo chúng sau này bằng con đường nhập khẩu của họ (các lớp mô hình là một phần một ngoại lệ, mặc dù):

  1. Ứng dụng được tham chiếu theo đường dẫn nhập của họ (hoặc đường dẫn nhập AppConfig). Mặc dù có một số phép thuật liên quan đến test.pymodels.py, hầu hết các lần nhập/tham chiếu khá rõ ràng.
  2. Lượt xem được tham chiếu bởi urls.py tệp, nhưng được nhập dưới dạng đường dẫn nhập python thông thường.
  3. Phần giữa được tham chiếu bằng các chuỗi biểu thị đường dẫn nhập kết thúc bằng tên lớp của chúng.
  4. Các cài đặt khác mà bạn thường không định cấu hình cũng là đường dẫn nhập đầy đủ.

Trường hợp ngoại lệ để minh bạch này là:

  1. models.py, test.py, admin.py: Họ có mục đích đặc biệt và có thể không tồn tại, cung cấp:

    1. Bạn sẽ không cần bất kỳ mô hình nào trong ứng dụng của bạn và sẽ cung cấp AppConfig (thay vì chỉ là tên ứng dụng) trong số INSTALLED_APPS của bạn.
    2. Bạn sẽ không dựa vào tự động phát hiện cho lớp quản trị trong ứng dụng của mình.
    3. Bạn không muốn thực hiện các thử nghiệm trên ứng dụng của mình hoặc sẽ chỉ định đường dẫn không mặc định cho lệnh chạy thử nghiệm dành riêng cho ứng dụng của bạn.
  2. mẫu và các tập tin tĩnh: dự án của bạn sẽ dựa vào bộ tải mỗi ứng dụng cho các tập tin tĩnh của bạn và cho các file mẫu của bạn, và cuối cùng là có một tìm kiếm brute-force trong mỗi ứng dụng của mình: bên trong của họ static/templates/ thư mục, nếu tồn tại, được tìm kiếm cho những tập tin đó.

Mọi thứ khác chỉ là bình thường trăn đang và, nếu bạn cần phải nhập khẩu chúng từ bất kỳ quan điểm, bạn chỉ cần làm một câu nhập khẩu bình thường đối với họ (kể từ khi chế độ code được nhập khẩu với cơ chế Python nhập khẩu bình thường) .

Các vấn đề liên quan