2016-04-01 17 views
0

Herkes, şablonlarda get_absolute_url kullanmak için çok iyi bir uygulama olduğunu söyler. Ama benim durumumda, tek sayfalık veri tabanına aynı sorgulara neden oluyor. İşte geliştirmem gereken URL'lerin yapısı (Müşteriyi zaten web sitesi üzerinde çalıştığı için değiştiremem ve Google, URL'leri değiştirirsem beğenmeyecektir) - mysite/category/subcategory/product_slug.html danSayfada (django) her seferinde get_absolute_url çağrısından nasıl sakınılır?

from django.conf.urls import url 

: İşte uRL kalıpları kodudur. Ben mysite/kategori/alt kategorideki de oraya gittiğinde

def get_absolute_url(self): 
    return reverse('product_detail', kwargs={'slug':self.slug, 'parent_category_slug':self.product_category.category_parent.slug, 
              'category_slug':self.product_category.slug}) 

yani, ben tüm ürünler alt kategorisine dahil bkz: import görünümleri burada

urlpatterns = [ 
    url(r'^(?P<parent_category_slug>[\w-]+)/(?P<category_slug>[\w-]+)/(?P<slug>[\w-]+)\.html$', views.ProductDetailView.as_view(), name='product_detail'), 
    url(r'^(?P<parent_slug>[\w-]+)/(?P<slug>[\w-]+)$', views.ProductListView.as_view(), name='products_of_category'), 
    url(r'^(?P<slug>\w+)$', views.SubCategoryListView.as_view(), name='sub_category'), 
    url(r'^$', views.CatalogIndexListView.as_view(), name='index'), 
] 

Ve Ürün modelinde get_absolute_url ait kodudur. Bu bir liste (aslında tablo, resimler, başlıklar vb.). Ve tüm resimlerin yanı sıra başlıkların ürün için url olmalıdır. İşte get_absolute_url defalarca denir çünkü Yani, sonuçta, ben, gerçekten veritabanına sorgular bir sürü var
e {% for product in products %} 

        <tr> 
         <td class="product_name_list"> 
          <a href="{{ product.get_absolute_url }}">{{ product.product_name }}</a> 
         </td> 
         <td class="product_article_list">{{ product.product_article }}</td> 
         {% if product.product_main_image %} 
          <td class="product_image_list"><a href="{{ product.get_absolute_url }}" ><img src='{{ product.product_main_image.url}}' alt=""></a></td> 
         {% else %} 
          <td class="product_image_list"><a href="{{ product.get_absolute_url }}" ><img src='{% static "images/empty.gif" %}' alt=""></a></td> 
         {% endif %} 

         <td class="product_request_list"><a href="#">Запросить</a></td> 
        </tr> 

      {% endfor %} 

şablona

kod parçasıdır.

Lütfen bunu önlemek için bana yardım edin. 'Get_related()' ile varsayılan Yönetici sınıfını ayarlamayı denedim, ancak aptalca, acımasızca yardım etmedi, çünkü her instanse, get_absolute_url yöntemini tekrar tekrar çağırıyor.

Şimdiden teşekkürler! Eğer her ikisini de kullanmak mümkün olacak Bununla bu

from django.utils.functional import cached_property 

# You can either use it convert `get_abolute_url` method to property 
@cached_property 
def get_absolute_url(self): 
    return reverse(
     'product_detail', kwargs={ 
      'slug':self.slug, 
      'parent_category_slug':self.product_category.category_parent.slug, 
      'category_slug':self.product_category.slug}) 

# or decorate the method with different name so that you can use both 

cached_absolute_url = cached_property(get_absolute_url) 

çözmek için Django cached_property dekoratör kullanabilirsiniz

cevap

0

, yöntemin

object.get_absolute_url() 

object.cached_absolute_url 

cached_property önbelleğe değeri Aradığınızda böylece Yine, tüm yöntem boyunca ilerlemek yerine, doğrudan önbelleğe alınan değeri döndürür.

+0

Bu çok güzel, teşekkürler, bugün deneyeceğim –

+0

Cevabınıza "+" ekleyemiyorum. Cevabınız gerçekten ihtiyacım olan şey değildi, ama yine de çok kullanışlı. Anladım, görünümlerimde {% url%} ve "select_related", "prefetch_related", queryset'de kullanmalıydım. –

+0

url etiketini kullanmak, get_absolute_url işlevini kullanmakla aynı şeydir. Aslında, model nesnelerin DRY link üretimi için 'get_absolute_url'' url' etiketinin kullanılması tavsiye edilir. – v1k45

İlgili konular