2011-11-09 7 views
2

私はtemplate_name_field経由で特定のテンプレートを使用するフィールドを持っているDjango-MPTTを使用したモデルを持っています。私は汎用TemplateViewを使用することができますが、template_name_fieldを使用するためにmixinを渡したいと思います。Django TemplateViewのtemplate_name_fieldにmixinを渡すには?

from django.core.exceptions import ImproperlyConfigured 
from django.core.urlresolvers import reverse 
from django.views.generic import TemplateView, DetailView 
from django.views.generic.detail import SingleObjectTemplateResponseMixin 
from django.utils.translation import ugettext as _ 
from django.contrib.syndication.views import Feed 

from storefront.categories.models import Category 

class SimpleCategoryView(TemplateView): 

    def get_category(self): 
     return Category.objects.get(full_slug=self.kwargs['full_slug']) 

    def get_context_data(self, **kwargs): 
     context = super(SimpleCategoryView, self).get_context_data(**kwargs) 
     context["category"] = self.get_category() 
     return context 

そして、ここでは私のURLです:ここで

from django.db import models 
from mptt.models import MPTTModel 
from mptt.fields import TreeForeignKey 

class CategoryManager(models.Manager): 
    def get(self, **kwargs): 
     defaults = {} 
     defaults.update(kwargs) 
     if 'full_slug' in defaults: 
      if defaults['full_slug'] and defaults['full_slug'][-1] != "/": 
       defaults['full_slug'] += "/" 
     return super(CategoryManager, self).get(**defaults) 

class Category(MPTTModel): 
    title = models.CharField(max_length=255) 
    description = models.TextField(blank=True, help_text='A brief description of the category. No HTML allowed.') 
    slug = models.SlugField(help_text='Prepopulates from title field.') 
    full_slug = models.CharField(max_length=255, blank=True) 
    template_name = models.CharField(max_length=70, blank=True, help_text="Example: 'categories/category_parent.html'. If this isn't provided, the system will use 'categories/category_detail.html'.") 

    parent = TreeForeignKey('self', null=True, blank=True, related_name='children') 

    objects = CategoryManager() 

    class Meta: 
     verbose_name = 'category' 
     verbose_name_plural = 'categories' 

    def save(self, *args, **kwargs): 
     orig_full_slug = self.full_slug 
     if self.parent: 
      self.full_slug = "%s%s/" % (self.parent.full_slug, self.slug) 
     else: 
     self.full_slug = "%s/" % self.slug 
     obj = super(Category, self).save(*args, **kwargs) 
     if orig_full_slug != self.full_slug: 
      for child in self.get_children(): 
       child.save() 
     return obj 

    def __unicode__(self): 
     return "%s (%s)" % (self.title, self.full_slug) 

ビューです:

from django.conf.urls.defaults import patterns, include, url 
from storefront.categories.models import Category 
from storefront.categories.views import CategoryView 

urlpatterns = patterns('', 
    url(r'^(?P<full_slug>[-\w/]+)', SimpleCategoryView.as_view(template_name='categories/category_detail.html'), name='category_view'), 

)、私が追加に行くかどう

ここ

は、モデルの私のためのmixin g template_name_field私の見解に?

答えて

1

あなたは別のミックスインは必要ありません。 TemplateViewにはすでにTemplateResponseMixinが含まれているため、SimpleCategoryViewサブクラスでget_template_namesを単に上書きすることができます。

class SimpleCategoryView(TemplateView): 
    ... 
    def get_template_names(self): 
     return [self.get_category().template_name] 
+0

動作しますが、 'template_name'がNoneの場合、どのように例外を指定するのですか? –

+0

私はそれを見つけました 'else:return ['categories/category_detail.html']' –

+0

FWIW、 'get_template_names'はテンプレートのリストを返します。つまり、あなたはフォールバックを提供することができます。それは、順番に各項目を試し、実際のファイルに一致する最初のものと一緒に行く。 –

0

DetailViewには、必要なものがすべて含まれている必要があります。 DetailView.get_template_names()には、template_name_field属性を使用して、どのフィールドにテンプレート名を含めることができるかを伝えるだけです。以下は、URL内のスラッグに基づいてCategoryを取得する完全なビューの定義です。 Categoryは、テンプレートでobjectcategoryの両方で使用できることに注意してください。

class SimpleCategoryView(DetailView): 
    model = Category 
    slug_url_kwarg = 'full_slug' 
    slug_field = 'full_slug' 
    template_name_field = 'template_name' 
関連する問題