2016-01-30 2 views
0

Интересно, можно ли получить атрибут объекта в классах на основе Django.Получить атрибут объекта в представлении на основе класса

То, что я пытаюсь сделать, это следующее:

У меня есть UpdateView:

class FooUpdate(UpdateView): 
model = Foo 

page_title = <foo-object's name should go here> 

page_title обрабатывается шаблон с

... 
<title> 
    {{ view.page_title }} 
</title> 
... 

(этот метод описан here)

urls.py выглядит следующим образом:

... 
url(r'^edit/(?P<pk>[0-9]+)/$', views.FooUpdate.as_view(), name="edit") 
... 

Как я могу установить page_title в представлении?

Я знаю, что есть много других способов для достижения этой цели, но установка переменной в окне было очень удобно (до сих пор) ...

ответ

1

Вы можете использовать mixin для достижения чего-то подобного.

class ContextMixin: 
    extra_context = {} 

    def get_context_data(self, **kwargs): 
     context = super(ContextMixin, self).get_context_data(**kwargs) 
     context.update(self.extra_context) 
     return context 

class FooUpdate(ContextMixin, UpdateView): 
    model = Foo 
    extra_context={'page_title': 'foo-objects name should go here'} 

Редактировать: другой миксин, который чувствует себя немного взломанным, но ближе к тому, что вы хотите. Я не тестировал его, но думаю, он должен работать.

class AutoContextMixin: 

    def get_context_data(self, **kwargs): 
     context = super(AutoContextMixin, self).get_context_data(**kwargs) 
     for key in dir(self): 
      value = getattr(self, key) 
      if isinstance(value, str) and not key.startswith('_'): 
       context[key] = value 
     return context 

class FooUpdate(AutoContextMixin, UpdateView): 
    model = Foo 
    page_title = 'foo-objects name should go here' 
+0

спасибо! но как мне понадобится смесь для этого? То же самое можно сделать и в 'FooUpdate', или нет? – speendo

+1

Да, но с помощью mixin вы можете импортировать и повторно использовать код в нескольких классах и приложениях. Таким образом, вам не нужно писать 'get_context_data' каждый раз, когда вы хотите только добавить некоторые простые значения. –

+0

Я добавил второй пример mixin, который может быть ближе к тому, что вам нужно. –

1

Нет, вы не можете определить атрибуты, как это.

Ближайшие вы могли бы сделать, чтобы определить метод page_title, что возвращаемого self.object.your_field, но я не вижу, как это было бы лучше, чем переопределение get_context_data и добавить его там.

+0

Мне все равно придется адаптировать шаблон, не так ли? В этом случае нет преимущества ... – speendo

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

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