كيف يمكنني الحصول على عنوان URL العكسي لقالب Django FlatPages
-
16-09-2019 - |
سؤال
كيف يمكنني الحصول على عنوان 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>
في القالب الخاص بك.