2016-03-23 5 views
0

Я использую CBV в своем приложении django и задаюсь вопросом, как я могу получить экземпляр в моей get_context_data И в моих get_initial функциях без повторения кода.Django DRY class based

пример:

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. Затем вы можете получить доступ к атрибуту self.blog в своих get_context_data и get_initial просмотрах.

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') вместо отправки, например. если вы использовали mixin, который проверял разрешения, а код, который создает локальную переменную, использует зарегистрированного пользователя. В вашем случае, я думаю, что безопасно переопределять 'dispatch', и это сохраняет дублирование вызова' self.blog = get_blog() 'в методах' get' и 'post'. – Alasdair

0

Ok после повторного прочтения документации я нашел правильный способ сделать это:

  1. выборки экземпляра блога в get_initial и хранить в в self.blog
  2. добавить self.blog в контексте в get_context_data

get_initial запускается до get_context_data, поэтому не извлекайте экземпляр блога в get_context_data, иначе вы получите ошибку, такую ​​как I сделал:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^