Last active
December 14, 2016 01:11
-
-
Save archatas/3dd5d271e72f1731d10981344af42813 to your computer and use it in GitHub Desktop.
Django administration inlines for inlines
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: UTF-8 -*- | |
from django.contrib import admin | |
from django.core.urlresolvers import reverse | |
from django.utils.translation import ugettext_lazy as _ | |
from django.utils.text import force_text | |
from .models import Painter, Picture, Review | |
def get_picture_preview(obj): | |
if obj.pk: # if object has already been saved and has a primary key, show picture preview | |
return """<a href="{src}" target="_blank"><img src="{src}" alt="{title}" style="max-width: 200px; max-height: 200px;" /></a>""".format( | |
src=obj.picture.url, | |
title=obj.title, | |
) | |
return _("(choose a picture and save and continue editing to see the preview)") | |
get_picture_preview.allow_tags = True | |
get_picture_preview.short_description = _("Picture Preview") | |
class PictureInline(admin.StackedInline): | |
model = Picture | |
extra = 0 | |
fields = ["get_edit_link", "title", "picture", get_picture_preview] | |
readonly_fields = ["get_edit_link", get_picture_preview] | |
def get_edit_link(self, obj=None): | |
if obj.pk: # if object has already been saved and has a primary key, show link to it | |
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[force_text(obj.pk)]) | |
return """<a href="{url}">{text}</a>""".format( | |
url=url, | |
text=_("Edit this %s separately") % obj._meta.verbose_name, | |
) | |
return _("(save and continue editing to create a link)") | |
get_edit_link.short_description = _("Edit link") | |
get_edit_link.allow_tags = True | |
@admin.register(Painter) | |
class PainterAdmin(admin.ModelAdmin): | |
save_on_top = True | |
fields = ["name"] | |
inlines = [PictureInline] | |
class ReviewInline(admin.StackedInline): | |
model = Review | |
extra = 0 | |
fields = ["reviewer", "comment"] | |
@admin.register(Picture) | |
class PictureAdmin(admin.ModelAdmin): | |
save_on_top = True | |
fields = ["painter", "title", "picture", get_picture_preview] | |
readonly_fields = [get_picture_preview] | |
inlines = [ReviewInline] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: UTF-8 -*- | |
from __future__ import unicode_literals | |
import os | |
from django.db import models | |
from django.utils.encoding import python_2_unicode_compatible | |
from django.utils.translation import ugettext_lazy as _ | |
from django.utils.text import slugify | |
@python_2_unicode_compatible | |
class Painter(models.Model): | |
name = models.CharField(_("Name"), max_length=255) | |
class Meta: | |
verbose_name = _("Painter") | |
verbose_name_plural = _("Painters") | |
def __str__(self): | |
return self.name | |
def upload_to(instance, filename): | |
filename_base, filename_ext = os.path.splitext(filename) | |
return "painters/{painter}/{filename}{extension}".format( | |
painter=slugify(instance.painter.name), | |
filename=slugify(filename_base), | |
extension=filename_ext.lower(), | |
) | |
@python_2_unicode_compatible | |
class Picture(models.Model): | |
painter = models.ForeignKey(Painter, verbose_name=_("Painter"), on_delete=models.CASCADE) | |
title = models.CharField(_("Title"), max_length=255) | |
picture = models.ImageField(_("Picture"), upload_to=upload_to) | |
class Meta: | |
verbose_name = _("Picture") | |
verbose_name_plural = _("Pictures") | |
def __str__(self): | |
return self.title | |
@python_2_unicode_compatible | |
class Review(models.Model): | |
picture = models.ForeignKey(Picture, verbose_name=_("Picture"), on_delete=models.CASCADE) | |
reviewer = models.CharField(_("Reviewer name"), max_length=255) | |
comment = models.TextField(_("Comment")) | |
class Meta: | |
verbose_name = _("Review") | |
verbose_name_plural = _("Reviews") | |
def __str__(self): | |
return self.reviewer |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment