/* models.py */ from django.db import models from django.utils.text import slugify # Create your models here. def get_unique_slug(model,field_name,value): max_length = model._meta.get_field(field_name).max_length slug = slugify(value) num = 1 unique_slug = '{}-{}'.format(slug[:max_length - len(str(num)) - 1], num) while model.objects.filter(** {field_name: unique_slug}).exists(): unique_slug = '{}-{}'.format(slug[:max_length - len(str(num)) - 1], num) num += 1 return unique_slug class Post(models.Model): name = models.CharField(max_length=255) description = models.TextField() slug = models.SlugField(max_length=5, unique=True, blank=True, editable=False) slug2 = models.SlugField(max_length=10, blank=True, editable=False) def __str__(self): return self.slug def save(self, *args, **kwargs): if not self.slug: self.slug = get_unique_slug(self.__class__,'slug',self.name) if not self.slug2: self.slug2 = get_unique_slug(self.__class__,'slug2',self.name) super().save(*args, **kwargs) class Image(models.Model): post = models.ForeignKey(Post, related_name='images') file = models.ImageField(upload_to='upload') position = models.PositiveSmallIntegerField(default=0) class Meta: ordering = ['position'] def __str__(self): return '%s - %s ' % (self.post, self.file) /* admin.py */ from django.contrib import admin from django import forms from .widgets import AdminImageWidget from .inputs import AdvancedImageInput from .models import * # Register your models here. admin.site.register(Image) class ImageForm(forms.ModelForm): # file = AdvancedImageInput() class Meta: model = Image widgets = { 'file': AdminImageWidget } fields = '__all__' class ImageInline(admin.StackedInline): form = ImageForm model = Image extra = 0 class PostForm(forms.ModelForm): model = Post class Media: js = ( '/static/js/jquery.min.js', '/static/js/jquery-ui.min.js', '/static/js/inline-sort.js', ) class PostAdmin(admin.ModelAdmin): form = PostForm inlines = [ImageInline] def save_model(self, request, obj, form, change): super(PostAdmin,self).save_model(request, obj, form, change) # obj.save() for afile in request.FILES.getlist('photos_multiple'): obj.images.create(file=afile) admin.site.register(Post, PostAdmin) """ /* menu-sort.js */ jQuery(function($) { $('div.inline-group').sortable({ /*containment: 'parent', zindex: 10, */ items: 'div.inline-related', handle: 'h3:first', update: function() { $(this).find('div.inline-related').each(function(i) { if ($(this).find('input[id$=position]').val()) { $(this).find('input[id$=position]').val(i+1); } }); } }); $('div.inline-group').find('div.inline-related').each(function(i) { if ($(this).find('input[id$=position]').val()) { $(this).find('input[id$=position]').val(i+1); } }); $('div.inline-related h3').css('cursor', 'move'); // $('div.inline-related').find('input[id$=position]').parent('div').hide(); }); """