我正在学习Django
,我似乎无法弄清楚我在哪里实现常规Python类。我的意思是,我不知道我写的Python类在哪里。就像他们进入一个单独的文件然后导入views.py
或者是views.py
文件中实现的类一样?
示例我想实现一个Class Alphabet
,我应该在模块内的单独文件中执行此操作,还是只实现views.py
文件中的函数?
答案 0 :(得分:4)
我不知道我写的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 tutorial。
<强>的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 /模板/ 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.
})
然后,模板会将else
index.html
部分发送到浏览器:
抱歉,无法得到结果。
<强> 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'),
]
答案 1 :(得分:3)
Django在一天结束时只是Python。
您可以在项目的任何位置创建新模块,并将它们导入到视图,模型,网址等中。这通常是您组织常规工具(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 }}
答案 2 :(得分:1)
这取决于Alphabet类的范围。如果它是一个实用程序类,那么我建议放入一个utils.py文件,例如。但是在views.py文件中有类,主要是那些处理UI处理的类是完全没问题的。由你决定。
答案 3 :(得分:1)
与类似的框架不同,您可以将Python代码放在项目的任何位置,前提是稍后可以通过导入路径引用它们(模型类部分是例外):
AppConfig
导入路径)引用。虽然有一些涉及test.py
和models.py
的魔法,但大多数情况下导入/引用非常明确。urls.py
文件引用,但作为常规python导入路径导入。这种显性的例外是:
models.py,test.py,admin.py:它们有特殊用途,可能不存在,提供:
AppConfig
中提供INSTALLED_APPS
(而不仅仅是应用名称)。模板和静态文件:您的项目将依赖于每个应用程序加载器来获取静态文件和模板文件,并最终在每个应用程序中进行强力搜索:内部{{1}和static/
目录(如果存在)将搜索这些文件。
其他一切都只是普通的python代码,如果你需要从任何视图中导入它们,你只需为它们做一个正常的导入句子(因为视图代码是用普通的Python导入机制导入的) )。