Django, ссылающийся на URL-адреса между приложениями

#django #django-urls

#django #django-urls

Вопрос:

У меня есть проект, который только что объединил несколько приложений из других моих проектов в один основной проект. Структура — это одно основное приложение, которое находится в корневом URL-адресе, и другие приложения с определенными URL-адресами. Я настроил свой urls.py:

 url(r'^

У меня есть модель в моих моделях main_app.py, который описывает мои другие приложения следующим образом:

 class App(models.Model):
    title = models.CharField()
    image = models.ImageField("App Image", upload_to="images/apps/", blank=True, null=True)
    description = models.TextField()
 

И в моих представлениях main_app:

 def index(request):
    app_list = App.objects.all()
    return render_to_response('index.html',
            locals(), context_instance=RequestContext(request)) 
 

Итак, в моем шаблоне корневого индекса (main_app) Я хочу перебрать все приложения и распечатать ссылку:

 {% for app in app_list %}
    {{ some_app_variables }}
    <a href="???">Link to app</a>
{% endfor %}
 

Мой вопрос в том, как я должен определить эту ссылку. Должен ли у меня быть get_absolute_url для модели приложения?

Любая помощь очень ценится.

Ответ №1:

Приложение по своей сути не имеет какого-либо связанного с ним URL-адреса. URL-адреса привязаны к представлениям, и эти представления могут ссылаться на любую модель из любого приложения или вообще не иметь моделей или приложений, если на то пошло. То, что вы делаете, не имеет смысла.

ОБНОВЛЕНИЕ: я все еще не уверен, на что вы ссылаетесь. "Приложение" - это абстрактное понятие. Я понимаю, что у меня есть список "приложений", но какой вид вы бы получили для отдельного приложения? Тем не менее, да, у вас должен быть get_absolute_url метод в вашей Apps модели. Тогда лучше всего было бы назвать любое представление в каждом приложении "индексным" представлением, похожим на "app_ (title)". Затем вы можете построить правильное обратное с помощью чего-то вроде:

 @models.permalink
def get_absolute_url(self):
    return ('app_%s' % self.title, (), {})
 

Конечно, вам, вероятно, следует изменить это чем-то похожим на slug, чтобы разместить заголовки, которые могут содержать несколько слов, например, "Классное приложение" нужно было бы заменить на что-то вроде "cool_app".

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

Комментарии:

1. Я добавил некоторую информацию о своих моделях и представлениях, которые, надеюсь, должны прояснить, что я хотел бы сделать.

2. Это больше похоже на то, о чем я думал. Я уверен, что, должно быть, плохо объясняю себя, хотя, как я предполагаю, это фундаментальный вопрос для любого проекта с несколькими приложениями. Другими словами, как бы вы ссылались на каждое из ваших приложений с центральной домашней страницы, без жесткого кодирования URL-адресов в шаблоне?

3. Видите ли, проблема в том, что приложения обычно не обрабатываются так, как определено. У вас может быть приложение календаря на вашем сайте, но вы не ссылаетесь на "приложение". вы создаете представление в этом приложении, которое знает, как отображать календарь, а затем вы прикрепляете URL-адрес, такой как "/ calendar /", к этому представлению. Приложение может называться "календарь" или "события" или "корм для собак". На самом деле это не имеет значения. Это просто контейнер для определенного набора функций.

4. Да, это был мой типичный вариант использования, но для этого проекта у меня есть несколько приложений, которые делают совершенно разные вещи и имеют отдельные базы данных, но должны совместно использовать сайт, и я хочу иметь возможность обмениваться данными между базами данных. Для этой мотивации я объединяю свои разработанные приложения в один проект с псевдонимами базы данных. Однако каждое приложение имеет свои собственные URL-адреса, представления и шаблоны.

5. На самом деле это не имеет значения. Вы просто включаете в каждое приложение urls.py в URL-адресах проекта. py привязывает их к базовому URL-адресу, например, приложение календаря, скорее всего, будет включено в '/ calendar/'. Тогда все URL-адреса внутри будут находиться под этим префиксом URL. После того, как обработка была передана из соответствующего представления, больше ничего не имеет значения. Вы можете использовать модели из любых приложений, иметь пользовательские шаблоны, даже чтобы сайт выглядел совершенно по-другому.

, include('main_app.urls')),
url(r'^app1/', include('app1.urls')),
url(r'^app2/', include('app2.urls')),
url(r'^app3/', include('app3.urls')),
У меня есть модель в моих моделях main_app.py, который описывает мои другие приложения следующим образом:


И в моих представлениях main_app:


Итак, в моем шаблоне корневого индекса (main_app) Я хочу перебрать все приложения и распечатать ссылку:


Мой вопрос в том, как я должен определить эту ссылку. Должен ли у меня быть get_absolute_url для модели приложения?

Любая помощь очень ценится.

Ответ №1:

Приложение по своей сути не имеет какого-либо связанного с ним URL-адреса. URL-адреса привязаны к представлениям, и эти представления могут ссылаться на любую модель из любого приложения или вообще не иметь моделей или приложений, если на то пошло. То, что вы делаете, не имеет смысла.

ОБНОВЛЕНИЕ: я все еще не уверен, на что вы ссылаетесь. «Приложение» — это абстрактное понятие. Я понимаю, что у меня есть список «приложений», но какой вид вы бы получили для отдельного приложения? Тем не менее, да, у вас должен быть get_absolute_url метод в вашей Apps модели. Тогда лучше всего было бы назвать любое представление в каждом приложении «индексным» представлением, похожим на «app_ (title)». Затем вы можете построить правильное обратное с помощью чего-то вроде:


Конечно, вам, вероятно, следует изменить это чем-то похожим на slug, чтобы разместить заголовки, которые могут содержать несколько слов, например, «Классное приложение» нужно было бы заменить на что-то вроде «cool_app».

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

Комментарии:

1. Я добавил некоторую информацию о своих моделях и представлениях, которые, надеюсь, должны прояснить, что я хотел бы сделать.

2. Это больше похоже на то, о чем я думал. Я уверен, что, должно быть, плохо объясняю себя, хотя, как я предполагаю, это фундаментальный вопрос для любого проекта с несколькими приложениями. Другими словами, как бы вы ссылались на каждое из ваших приложений с центральной домашней страницы, без жесткого кодирования URL-адресов в шаблоне?

3. Видите ли, проблема в том, что приложения обычно не обрабатываются так, как определено. У вас может быть приложение календаря на вашем сайте, но вы не ссылаетесь на «приложение». вы создаете представление в этом приложении, которое знает, как отображать календарь, а затем вы прикрепляете URL-адрес, такой как «/ calendar /», к этому представлению. Приложение может называться «календарь» или «события» или «корм для собак». На самом деле это не имеет значения. Это просто контейнер для определенного набора функций.

4. Да, это был мой типичный вариант использования, но для этого проекта у меня есть несколько приложений, которые делают совершенно разные вещи и имеют отдельные базы данных, но должны совместно использовать сайт, и я хочу иметь возможность обмениваться данными между базами данных. Для этой мотивации я объединяю свои разработанные приложения в один проект с псевдонимами базы данных. Однако каждое приложение имеет свои собственные URL-адреса, представления и шаблоны.

5. На самом деле это не имеет значения. Вы просто включаете в каждое приложение urls.py в URL-адресах проекта. py привязывает их к базовому URL-адресу, например, приложение календаря, скорее всего, будет включено в ‘/ calendar/’. Тогда все URL-адреса внутри будут находиться под этим префиксом URL. После того, как обработка была передана из соответствующего представления, больше ничего не имеет значения. Вы можете использовать модели из любых приложений, иметь пользовательские шаблоны, даже чтобы сайт выглядел совершенно по-другому.