Comparing implementationsΒΆ

The following are simple, quite common views from a real world application.

Django 1.3 Class-based generic views:

class ArtistDetail(DetailView):
    context_object_name = 'artist'
    queryset = Artist.publ.all()

utkik.View:

class ArtistDetail(View):
    def get(self, slug):
        self.c.artist = get_object_or_404(Artist.publ, slug=slug)

Note

The following two list views are written a little differently regarding the context collection to reflect more real world usage.

Django 1.3 Class-based generic views:

class ArtistList(TemplateView):
    template_name = 'artists/artist_list.html'

    def get_context_data(self, slug=None, tag=None):
        genre = get_object_or_404(Genre.objects, slug=slug)
        artists = Artist.publ.filter(genres=genre).order_by('?')
        tags = Tag.objects\
            .filter(artist__genres=genre, artist__active=True)\
            .annotate(num_tags=Count('artist'))\
            .filter(num_tags__gte=2)\
            .order_by('-num_tags')\
            .distinct()
        return {
            'artists': artists,
            'tags': tags,
            'selected_genre': genre,
        }

utkik.View:

class ArtistList(View):
    def get(self, slug=None, tag=None):
        self.c.selected_genre = get_object_or_404(Genre.objects, slug=slug)
        self.c.artists = Artist.publ.filter(genres=self.c.selected_genre).order_by('?')
        self.c.tags = Tag.objects\
            .filter(artist__genres=self.c.selected_genre, artist__active=True)\
            .annotate(num_tags=Count('artist'))\
            .filter(num_tags__gte=2)\
            .order_by('-num_tags')\
            .distinct()

Django 1.3 Class-based generic views:

class MoreArtists(TemplateView):
    template_name = 'artists/inc/artists_in_focus.html'

    def dispatch(self, request, *args, **kwargs):
        if not request.is_ajax():
            return HttpResponseForbidden()
        return super(MoreArtists, self).dispatch(request, *args, **kwargs)

    def get_context_data(self):
        return { 'artists': Artist.publ.all().order_by('?')[:6] }

utkik.View:

class ArtistsInFocus(View):
    decorators = [ requires_ajax ]

    def get(self):
        self.c.artists = Artist.publ.all().order_by('?')[:6]

Django 1.3 Class-based generic views:

class ArtistLogin(FormView):
    form_class = ArtistLoginForm
    template_name = 'artists/artist_login.html'

    def get(self, request, *args, **kwargs):
        request.session.set_test_cookie()
        return super(ArtistLogin, self).get(request, *args, **kwargs)

    def form_valid(self, form):
        login(self.request, form.artist)
        return HttpResponseRedirect(reverse('artist_mypage'))

    def get_form_kwargs(self):
        kwargs = super(ArtistLogin, self).get_form_kwargs()
        kwargs['request'] = self.request
        return kwargs

utkik.View:

class ArtistLogin(View):
    def setup(self):
        self.c.form = ArtistLoginForm(
            request=self.request, data=self.request.POST or None)

    def get(self):
        self.request.session.set_test_cookie()

    def post(self):
        if self.c.form.is_valid():
            login(self.request, self.c.form.artist)
            return HttpResponseRedirect(reverse('artist_mypage'))

Django 1.3 Class-based generic views:

from django.conf.urls.defaults import *
from artists.views import ArtistDetail, ArtistList, ArtistTagList, MoreArtists, ArtistSearch, ArtistMyPage


urlpatterns = patterns('',
    url(r'^min-sida/$', ArtistMyPage.as_view(), name='artist_mypage'),
    url(r'^artister/$', MoreArtists.as_view(), name='artist_more'),
    url(r'^artister/sok/$', ArtistSearch.as_view(), name='artist_search'),
    url(r'^artister/(?P<slug>[-\w]+)/$', ArtistList.as_view(), name='artist_genre_list'),
    url(r'^artister/(?P<slug>[-\w]+)/(?P<tag>.*)/$', ArtistTagList.as_view(), name='artist_genre_tag_list'),
    url(r'^(?P<slug>[-\w]+)/$', ArtistDetail.as_view(), name='artist_detail'),
)

utkik.View:

from utkik.dispatch import *


urlpatterns = patterns('',
    url(r'^min-sida/$', 'artists.ArtistMyPage', name='artist_mypage'),
    url(r'^artister/$', 'artists.MoreArtists', name='artist_more'),
    url(r'^artister/sok/$', 'artists.ArtistSearch', name='artist_search'),
    url(r'^artister/(?P<slug>[-\w]+)/$', 'artists.ArtistList', name='artist_genre_list'),
    url(r'^artister/(?P<slug>[-\w]+)/(?P<tag>.*)/$', 'artists.ArtistTagList', name='artist_genre_tag_list'),
    url(r'^(?P<slug>[-\w]+)/$', 'artists.ArtistDetail', name='artist_detail'),
)

Note

You can of course use the utkik dispatcher for Django 1.3 Class-based generic views too.