Я изучаю Django самостоятельно и не могу понять, где я реализую обычный класс Python. Я имею в виду, что я не знаю, куда идут классы Python, которые я пишу. Как будто они помещаются в отдельный файл и затем импортируются в views.py, или классы реализованы внутри файла views.py?

Пример Я хочу реализовать Class Alphabet, должен ли я сделать это в отдельном файле внутри модуля или просто реализовать функции внутри файла views.py?

6
Silvestrini 17 Дек 2015 в 00:15

3 ответа

Лучший ответ

Я не знаю, куда идут классы Python, которые я пишу. Как будто они идут в отдельном файле, а затем импортируются в views.py. Пример Я хочу реализовать класс Алфавит.

Это просто вопрос правильности вашего оператора импорта:

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 / шаблоны / 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

URL в вашем браузере :

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'),
]
4
7stud 17 Дек 2015 в 00:56

Это зависит от области применения класса Alphabet. Если это служебный класс, я бы предложил, например, поместить файл utils.py. Но совершенно нормально иметь классы в файле views.py, в основном те, которые занимаются обработкой пользовательского интерфейса. Вам решать.

1
eribeiro 16 Дек 2015 в 22:05

Django - это просто Python в конце дня.

Вы можете создавать новые модули в любом месте вашего проекта и импортировать их в свои представления, модели, URL-адреса и т. Д. Часто так вы организовываете общие утилиты (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 }}

3
Patrick Beeson 16 Дек 2015 в 23:24