繁体   English   中英

在Django中的哪里实现python类?

[英]Where to implement python classes in Django?

我正在独自学习Django ,但似乎无法了解在何处实现常规Python类。 我的意思是,我不知道我写的Python类在哪里。 就像它们进入一个单独的文件,然后导入到views.py还是这些类是在views.py文件中实现的?

示例我想实现Class Alphabet ,我应该在模块内部的单独文件中执行此操作,还是仅在views.py文件中实现函数?

我不知道我写的Python类在哪里。 就像它们进入一个单独的文件,然后导入到views.py中一样。 示例我想实现一个Class Alphabet。

这只是使您的导入语句正确的问题:

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官方教程

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

启动服务器

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

浏览器中的网址

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

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

这取决于Alphabet类的范围。 如果是实用程序类,那么我建议例如放入utils.py文件。 但是在views.py文件中具有类(这主要是那些处理UI处理的类)是完全可以的。 由你决定。

与类似的框架不同,您可以将Python代码放在​​项目中的任何位置,只要以后可以通过它们的导入路径引用它们即可(模型类在某种程度上是一个例外):

  1. 应用程序通过其导入路径(或AppConfig导入路径)进行引用。 尽管有一些涉及test.pymodels.py魔术,但大多数时候导入/引用是相当明确的。
  2. 视图由urls.py文件引用,但作为常规python导入路径导入。
  3. 中间件由字符串引用,这些字符串表示以其类名结尾的导入路径。
  4. 您通常不配置的其他设置也是完整的导入路径。

这种明确性的例外是:

  1. models.py,test.py,admin.py:它们具有特殊用途,可能不存在,它们提供:

    1. 您的应用程序中将不需要任何模型,并且将在INSTALLED_APPS提供一个AppConfig (而不只是应用程序名称)。
    2. 您将不会依赖自动发现应用程序中的管理类。
    3. 您不想在您的应用程序上进行测试,或者将为特定于应用程序的测试命令运行指定非默认路径。
  2. 模板和静态文件:您的项目将依赖于每个应用程序的加载程序来获取静态文件和模板文件,最终每个应用程序中都存在蛮力搜索:它们的内部static/templates/目录(如果存在),搜索这些文件。

其他所有内容只是普通的python代码 ,如果您需要从任何视图导入它们,则只需为它们执行常规的导入语句(因为视图代码是通过常规的Python导入机制导入的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM