Adds a generic object detail view.

This commit is contained in:
Johnny 2018-10-26 00:15:48 +00:00
parent 524df146e2
commit e8d4bbf5fa
2 changed files with 39 additions and 1 deletions

View file

@ -19,6 +19,7 @@ urlpatterns = [
# Character management # Character management
url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="character-create"), url(r'^characters/create/$', website_views.CharacterCreateView.as_view(), name="character-create"),
url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="character-manage"), url(r'^characters/manage/$', website_views.CharacterManageView.as_view(), name="character-manage"),
url(r'^characters/detail/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDetailView.as_view(), name="character-detail"),
url(r'^characters/puppet/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterPuppetView.as_view(), name="character-puppet"), url(r'^characters/puppet/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterPuppetView.as_view(), name="character-puppet"),
url(r'^characters/update/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterUpdateView.as_view(), name="character-update"), url(r'^characters/update/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterUpdateView.as_view(), name="character-update"),
url(r'^characters/delete/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDeleteView.as_view(), name="character-delete"), url(r'^characters/delete/(?P<slug>[\w\d\-]+)/(?P<pk>[0-9]+)/$', website_views.CharacterDeleteView.as_view(), name="character-delete"),

View file

@ -5,6 +5,8 @@ the other applications. Views are django's way of processing e.g. html
templates on the fly. templates on the fly.
""" """
from collections import OrderedDict
from django.contrib.admin.sites import site from django.contrib.admin.sites import site
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
@ -155,6 +157,12 @@ class EvenniaCreateView(CreateView):
@property @property
def page_title(self): def page_title(self):
return 'Create %s' % self.model._meta.verbose_name.title() return 'Create %s' % self.model._meta.verbose_name.title()
class EvenniaDetailView(DetailView):
@property
def page_title(self):
return '%s Detail' % self.model._meta.verbose_name.title()
class EvenniaUpdateView(UpdateView): class EvenniaUpdateView(UpdateView):
@ -172,10 +180,36 @@ class EvenniaDeleteView(DeleteView):
# Object views # Object views
# #
class ObjectDetailView(DetailView): class ObjectDetailView(EvenniaDetailView):
model = class_from_module(settings.BASE_OBJECT_TYPECLASS) model = class_from_module(settings.BASE_OBJECT_TYPECLASS)
access_type = 'view' access_type = 'view'
template_name = 'website/object_detail.html'
attributes = ['name', 'desc']
def get_context_data(self, **kwargs):
"""
Adds an 'attributes' list to the context consisting of the attributes
specified at the class level, in the order provided.
Django views do not provide a way to reference dynamic attributes, so
we have to grab them all before we render the template.
"""
context = super(ObjectDetailView, self).get_context_data(**kwargs)
obj = self.get_object()
attribute_list = OrderedDict()
for attribute in self.attributes:
if attribute in self.model._meta._property_names:
attribute_list[attribute.title()] = getattr(obj, attribute, '')
else:
attribute_list[attribute.title()] = getattr(obj.db, attribute, '')
context['attribute_list'] = attribute_list
return context
def get_object(self, queryset=None): def get_object(self, queryset=None):
""" """
@ -357,6 +391,9 @@ class CharacterUpdateView(CharacterMixin, ObjectUpdateView):
form_class = CharacterUpdateForm form_class = CharacterUpdateForm
template_name = 'website/character_form.html' template_name = 'website/character_form.html'
class CharacterDetailView(CharacterMixin, ObjectDetailView):
pass
class CharacterDeleteView(CharacterMixin, ObjectDeleteView): class CharacterDeleteView(CharacterMixin, ObjectDeleteView):
pass pass