Разделение приложений django 2 - как получить информацию об объекте из слаг в URL - PullRequest
2 голосов
/ 04 января 2010

Я пытаюсь удалить пару из двух приложений:

  1. Locations - приложение, содержащее подробную информацию о каком-либо месте (город, страна, место и т. Д.)
  2. Каталог - приложение, содержащее подробную информацию о достопримечательностях (магазин, железнодорожный вокзал, паб и т. Д.) - все категории.

И locations.Location, и directory.Item содержат координаты широты / долготы, и я могу находить элементы на определенном расстоянии от определенной координаты широты и долготы.

Я хотел бы использовать следующую структуру URL:

/locations/<location_slug>/directory/<category_slug>/

Но я не хочу, чтобы мое приложение каталога зависело от моего приложения определения местоположения.

Как я могу перевести этот URL, чтобы использовать подобное представление в моем приложении каталога?

items_near(lat, lng, distance, category):

Обходным путем было бы создание нового представления где-нибудь, которое переводит это - но где я должен поместить это? если это происходит в приложении Справочника, то я связал это с моим приложением Локации, и наоборот.

Будет ли хорошей идеей поместить этот временный код в файл URL моего проекта? Таким образом держаться подальше от обоих приложений? Есть какие-нибудь проблемы с этим?

Ответы [ 3 ]

2 голосов
/ 05 января 2010

Чтобы ваш urlpattern работал, вызываемая функция просмотра должна знать как о расположениях, так и о каталогах. Короткий ответ: вы можете поместить эту функцию представления в любое место - это просто функция Python. Но для этого может быть несколько логичных мест, кроме приложения «Каталог» или «Местоположение», которые имеют смысл.

Прежде всего, я бы не вставлял этот код представления в ваш файл верхнего уровня urls.py, так как этот файл предназначен для кода, связанного с URLconf.

Несколько вариантов того, где разместить ваше мнение:

  1. Создать новую функцию просмотра в файле, который находится за пределами любого конкретного приложения. <project_root>/views.py это одна возможность. В этом представлении нет ничего плохого, вызывая представление item_near(..) из приложения Directory.

    # in myproject/urls.py
    
    urlpatterns = (
       ...
       (r'/locations/(?P<location_slug>[\w\-]+)/directory/(?P<category_slug>[\w\-]+)/', 
        'myproject.views.items_near_from_slug')
    )
    
    # in myproject/views.py
    
    from directory.views import items_near
    
    def items_near_from_slug(request, location_slug, category_slug):
      location = get_object_or_404(Location, slug=location_slug)
    
      distance = 2 # not sure where this comes from
    
      # And then just invoke the view from your Directory app
      return items_near(request, location.lat, location.lng, distance, category_slug)
    
  2. Создайте новое приложение и поместите туда код, в <my_new_app>/views.py. Не требуется, чтобы приложение Django имело файлы models.py, urls.py и т. Д. Просто убедитесь, что вы включили __init__.py, если вы хотите, чтобы Django правильно загружал приложение (например, если вы хотите, чтобы Django автоматически находить теги шаблонов или шаблоны приложений).

Лично я бы выбрал вариант 1, только если проект относительно прост, и <project_root>/views.py не грозит загромождать представления обо всем. В противном случае я бы выбрал вариант 2, особенно если вы ожидаете, что у вас будет другой код, который должен знать о локациях и каталогах. С помощью опции 2 вы также можете собирать соответствующие urlpatterns в их собственные специфичные для приложения urls.py.

0 голосов
/ 05 января 2010

Независимо от того, сколько раз «повторно» используется ваше приложение, неизбежно возникает необходимость в коде, специфичном для сайта.

Я думаю, что логично создать «специфичное для сайта» приложение, которое использует представления многократно используемых и отделенных приложений.

0 голосов
/ 05 января 2010

Из документации django здесь если вы используете django> = 1.1, тогда вы можете передать любую захваченную информацию во включенное приложение. Итак, разделение на несколько файлов:

# in locations.urls.py

urlpatterns = ('',
  (r'location/(?P<location_slug>.*?)/', include('directory.urls')),
  #other stuff
  )


# in directory.urls.py

urlpatterns = ('',
  (r'directory/(?P<directory_slug>.*?)/', 'directory.views.someview'),
  #other stuff
  )

# in directory.views.py

def someview(request, location_slug = None, directory_slug = None):
 #do stuff

Надеюсь, это поможет. Если вы в django <1.1, я понятия не имею. </p>

...