كيف يمكنني الحصول على عنوان URL العكسي لقالب Django FlatPages

StackOverflow https://stackoverflow.com/questions/1144691

سؤال

كيف يمكنني الحصول على عنوان URL العكسي لقالب Django FlatPages

هل كانت مفيدة؟

المحلول

تشمل المسطحات المسطحة في Urlconf الجذر الخاص بك:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    ('^pages/', include('django.contrib.flatpages.urls')),
)

ثم، في رأيك، يمكنك الاتصال بالعكس مثل ذلك:

from django.core.urlresolvers import reverse

reverse('django.contrib.flatpages.views.flatpage', kwargs={'url': '/about-us/'})
# Gives: /pages/about-us/

في قوالب، استخدم علامة {٪ URL٪} (الذي يستدعي عكس داخليا):

<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>

نصائح أخرى

أفضل الحل التالي (تتطلب django> = 1.0).

settings.py

INSTALLED_APPS+= ('django.contrib.flatpages',)

urls.py

urlpatterns+= patterns('django.contrib.flatpages.views',
    url(r'^about-us/$', 'flatpage', {'url': '/about-us/'}, name='about'),
    url(r'^license/$', 'flatpage', {'url': '/license/'}, name='license'),
)

في القوالب الخاصة بك

[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]

أو في التعليمات البرمجية الخاصة بك

from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]

بهذه الطريقة لا تحتاج إلى استخدام django.contrib.flatpages.middleware.FlatpageFallbackMiddleware والعكس يعمل كالمعتاد دون كتابة الكثير من التعليمات البرمجية كما هو الحال في الحلول الأخرى.

هتافات.

أنا أتفق مع Anentropic. أنه لا توجد نقطة في استخدام Django FlatPages إذا كنت بحاجة إلى كتابة Urlconfs لتوظيفها. إنه أكثر مباشرة للاستخدام وجهات النظر العامة مثل TemplateView مباشرة:

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

urlpatterns = patterns('',
    url(r'^about/$', TemplateView.as_view(template_name="about.html"), name="about"),
)

المسطحة الاستفادة من FlatpageFallbackMiddleware, ، الذي يمسك 404 أخطاء ويحاول العثور على محتوى عن عنوان URL المطلوب في قاعدة البيانات الخاصة بك. الميزة الرئيسية هي أنه لا يتعين عليك لمس القوالب الخاصة بك مباشرة في كل مرة يتعين عليك تغيير شيء فيها، والحاجة إلى استخدام قاعدة بيانات :)

إذا كنت لا تزال تختار استخدام تطبيق FlatPages، فمن الأفضل استخدامه get_flatpages علامة القالب:

{% load flatpages %}
<ul>
    {% for page in get_flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

شخصيا، نادرا ما أشجع المسطحات المسطحة خارج القائمة الرئيسية للموقع، والتي يتم تضمينها عبر {% include 'includes/nav.html' %} ويبدو أن هذا:

<ul>
    <li><a href="/about/">About</a></li>
    <li><a href="/credits/">Credits</a></li>
    ...
</ul>

لا أشعر أنني انتهاك أي قبلة جافة أو شيء ما :)

اكتب عناوين URL الخاصة بك إلى الإشارة إلى المسطحين الخاص بك. افترض أنه تحت الصفحات:

urlpatterns = patterns('',
...
    url(r'^pages/', include('project.pages.urls')),
...
)

ثم اكتب المسطح المسطحي الخاص بك بشكل طبيعي:

urlpatterns = patterns('django.views.generic.simple',
    url(regex=r'^resume/$',     view='direct_to_template', kwargs={'template': 'resume.html'}, name='resume'),
    url(regex=r'^about/$',      view='direct_to_template', kwargs={'template': 'about.html'},  name='about'),
    url(regex=r'^books/$',      view='direct_to_template', kwargs={'template': 'library.html'},name='books'),
)

ثم يشير القالب الخاص بك فقط إليهم في الأزياء المعتادة:

<div id="pages">
...
    <div class="pagelinks">
        <a href="{% url about %}">ABOUT</a>
    </div>
</div>

اعتقدت أن ميزة المسطحات المسطحة هل لم يكن لديك لإنشاء أي كعب الرؤية أو url confs؟ إنه لا طائل منه بعض الشيء ... إذا كنت تقوم بإنشاء طرق عرض وعناوين URL، فيمكنك حفظ محتوى FlatPage كقالب HTML بدلا من ذلك.

جرب هذا بدلا من ذلك:https://github.com/0sn/nameremoved/wiki/flatpages.

عند إنشاء أي Flat، تحتاج إلى تحديد عنوان URL الذي يتم حفظه كجزء من النموذج. وبالتالي يمكنك استرداد عنوان URL من أي كائن FlatPage. في قالب:

{{ flatpage.url }}

إعادة تعيين عناوين URL FlatPage في urls.py ثم الاضطرار إلى استخدام نوع عكسي من الهزائم الغرض من التطبيق المسطح.

أيا من الحلول المذكورة اتبعت بشكل كاف المبدأ الجاف في رأيي، لذلك أنا فقط فعلت هذا:

# core/templatetags/hacks.py

from django import template

register = template.Library()

@register.simple_tag
def flaturl(title):
    """
        Returns the url for a flatpage based on the title.
        NOTE: Obviously the title must be unique.
    """

    from django.contrib.flatpages.models import FlatPage

    try:
        page = FlatPage.objects.get(title=title)
    except:
        return ""

    return page.url

ثم في أي قالب يحتاج إلى عمل رابط، فعلت هذا:

{% load hacks %}
...
<a href="{% flaturl 'My Page Title' %}">Page Title</a>

قد أضيف بعض التخزين المؤقت في هناك للحفاظ على الأداء، ولكن هذا يعمل بالنسبة لي.

تحتاج إلى RedeClare Url Conf ولا يمكن الاعتماد على المسؤول 'django.contrib.flatpages.urls' أن الوثيقة يشجعنا على استخدامها.

هذا لن يكون أكثر صعوبة، فقط تشمل في الخاص بك urls.py

from django.conf.urls import patterns, url

urlpatterns += patterns('',
    ...
    url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
    ...
)

والآن يمكنك استخدام علامة قالب عنوان URL العكسي المعتاد

<a href='{% url 'flatpage' url="/about-us/" %}'>About Us</a>

أو لعرض قائمة بجميع الصفحات المسطحة

<ul>
    {% get_flatpages as flatpages %}
    {% for page in flatpages %}
        <li><a href="{% url 'flatpage' url=page.url %}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

DJANGO المناسبة> = 1.10:

urls.py.

urlpatterns += [
    url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]

بحث سهل داخل القالب:

{% url "flatpage" url="SOME_URL" %}

حيث some_url هي القيمة من flatpage.url حقل

وفقا لهذا توثيق Django للتسويف

يمكنك ببساطة القيام به

{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

في القالب الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top