Moving items up/down from the admin interface

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class MyModel(models.Model):
	order = models.IntegerField(editable=False)
	#...

	def move(self, move):
		if move == 'UP':
			mm = MyModel.objects.get(order=self.order-1)
			mm.order += 1
			mm.save()
			self.order -= 1
			self.save()
			#...

class MyModelAdminForm(forms.ModelForm):
	move = forms.CharField(widget=forms.Select)
	move.required = False
	move.widget.choices=(
			(models.BLANK_CHOICE_DASH[0]),
			('FIRST', 'First'),
			('UP', 'Up'),
			('DOWN', 'Down'),
			('LAST', 'Last'),
		)
 
	class Meta:
		model = MyModel

class MyModelAdmin(admin.ModelAdmin):
	form = MyModelAdminForm
 
	def save_model(self, request, obj, form, change):
		obj.save()
		move = form.cleaned_data['move']
		obj.move(move)

admin.site.register(MyModel, MyModelAdmin)

More like this

  1. Orderable inlines using drag and drop with jQuery UI by simon 4 years, 8 months ago
  2. QuerySetManager - easily add new QuerySet methods using a Model inner class by simon 5 years ago
  3. Drag and drop admin list items by chrsgrrtt 2 years, 9 months ago
  4. Ordered items in the database - alternative by Leonidas 5 years, 11 months ago
  5. jstree integration to django admin by pawnhearts 3 years, 4 months ago

Comments

erikcw (on April 16, 2009):

Here is the full "move()" model method. I added some smarts to the algorithm to prevent "skipping".

[HTML_REMOVED]

def save(self, force_insert=False, force_update=False):
    """Custom save to add order property (make last item)."""
    if not self.order: #if this is a new object.
        mm = MyModel.objects.all().latest('order')
        self.order = mm.order + 1
    super(MyModel, self).save(force_insert, force_update)

def move(self, move):
    """Change the ordering of an object."""
    if move == 'UP':
        try:
            mm = MyModel.objects.filter(order__lt=self.order).order_by('-order')[0]
            self.order = mm.order
            mm.order += 1
            mm.save()
            self.save()
        except IndexError:
            pass
    elif move == 'DOWN':
        try:
            mm = MyModel.objects.filter(order__gt=self.order).order_by('order')[0]
            self.order = mm.order
            mm.order -= 1
            mm.save()
            self.save()
        except IndexError:
            pass
    elif move == 'FIRST':
        mm = MyModel.objects.all().order_by('order')[0]
        self.order = mm.order - 1
        self.save()
    elif move == 'LAST':
        mm = MyModel.objects.all().order_by('-order')[0]
        self.order = mm.order + 1
        self.save()

[HTML_REMOVED]

#

HuffmanWILLIE32 (on July 5, 2010):

Some specialists tell that [HTML_REMOVED]home loans[HTML_REMOVED] help people to live the way they want, just because they are able to feel free to buy necessary goods. Furthermore, a lot of banks present collateral loan for different classes of people.

#

(Forgotten your password?)