2016-03-23 22 views
0

私のdjangoアプリケーションでCBVを使用していて、get_context_dataとget_initial関数でインスタンスを取得するにはどうすればいいですか?Django DRYクラスベースのビュー

例:

class PostCreate(CreateView): 
model = Post 

def get_context_data(self, **kwargs): 
    context = super(VariationCreate, self).get_context_data(**kwargs) 
    blog_pk = self.kwargs.get('product_pk', None) 
    blog = None 
    if blog_pk: 
     try: 
      blog = Blog.objects.get(pk=blog_pk) 
     except Blog.DoesNotExist: 
      pass 
    context['blog'] = blog 
    return context 

def get_initial(self, **kwargs): 
    context = self.get_context_data(**kwargs) 
    blog_pk = self.kwargs.get('product_pk', None) 
    blog = None 
    if blog_pk: 
     try: 
      blog = Blog.objects.get(pk=blog_pk) 
      return {"blog": blog} 
     except Blog.DoesNotExist: 
      return {} 

ここでの目標は、あなたがクラスを作成し、あなたのビューでそれを拡張することができる唯一の

答えて

0

たらブログのインスタンスを取得することです:

CustomClass(object): 

    def get_context_data(self, **kwargs): 
     context = super(CustomClass, self).get_context_data(**kwargs) 
     blog_pk = self.kwargs.get('product_pk', None) 
     blog = None 
     if blog_pk: 
      try: 
       blog = Blog.objects.get(pk=blog_pk) 
      except Blog.DoesNotExist: 
       pass 
     context['product'] = product 
     return context 

    def get_initial(self, **kwargs): 
     context = self.get_context_data(**kwargs) 
     blog_pk = self.kwargs.get('product_pk', None) 
     blog = None 
     if blog_pk: 
      try: 
       blog = Blog.objects.get(pk=blog_pk) 
       return {"blog": blog} 
      except Blog.DoesNotExist: 
       return {} 

その後、あなたの中に表示:

class PostCreate(CreateView, CustomClass): 
    model = Post 

    def get_context_data(self, *args, **kwargs): 
     context = super(PostCreate, self).get_context_data(*args, **kwargs) 
     # add something else if needed 
     return context 
+0

私の質問の目標は、それは常にローカル変数を作成するには、ディスパッチを使用することをお勧めです二回 –

1

dispatchメソッドをオーバーライドし、そこでブログを取得します。それを属性self.blogとして設定します。その後、get_context_dataget_initialビューのself.blog属性にアクセスできます。

私はこれを行うための正しい方法を発見した再読み込みドキュメントの後に[OK]を
class PostCreate(CreateView): 

    def dispatch(self, *args, **kwargs): 
     # code that fetches the blog and sets self.blog 
     return super(PostCreate, self).dispatch(*args, **kwargs) 

    def get_initial(self, **kwargs): 
     initial = super(PostCreate, self).get_initial(**kwargs) 
     if self.blog is not None: 
      initial['blog'] = self.blog 
     return initial 

    def get_context_data(self, **kwargs): 
     context = super(PostCreate, self).get_context_data(**kwargs) 
     if self.blog is not None: 
      context['blog'] = self.blog 
     return context 
+0

[OK]をクールにブログのインスタンスを取得避けるためですか? –

+0

場合によっては、ディスパッチの代わりに別のメソッド(例えば、 'get'や' post')をオーバーライドする方が良いかもしれません。ローカル変数を作成するコードは、ログインしたユーザーを使用します。あなたの場合、 'dispatch'をオーバーライドすることは安全だと思うし、' self.blog = get_blog() 'を' get'メソッドと 'post'メソッドで呼び出すことの重複を節約します。 – Alasdair

0

  1. はget_initialにブログのインスタンスを取得し、self.blog
  2. にで保管し、コンテキストにself.blogを追加in get_context_data

get_initialがget_context_dataの前に実行されているため、get_context_dataでブログインスタンスを取得しないと、私のようなエラーが表示されますやった:

class PostCreate(CreateView): 
model = Post 

def get_initial(self, **kwargs): 
    context = self.get_context_data(**kwargs) 
    blog_pk = self.kwargs.get('product_pk', None) 
    self.blog = None 
    if blog_pk: 
     try: 
      self.blog = Blog.objects.get(pk=blog_pk) 
      return {"blog": self.blog} 
     except Blog.DoesNotExist: 
      return {} 

def get_context_data(self, **kwargs): 
    context = super(VariationCreate, self).get_context_data(**kwargs) 
    context['blog'] = self.blog 
    return context 
関連する問題