3

I'd like to update many-to-many through model data using Django-autocomplete-light's ModelSelect2Multiple, but when sending data to the form with the get_initial(), the data is not displayed in the order of the data sent; it will be displayed in the database registration order.

How should I do to display data in ModelSelect2Multiple in the sorted order in through model?

ModelSelect2Multiple works well when new data is registered.

Here is my model.py

class Writer(models.Model):
    name = models.CharField()

class Event(models.Model):
    name = models.CharField()
    writer = models.ManyToManyField(Writer, through="Attend", related_name='attends')

class Attend(models.Model):
    event = models.ForeignKey(Event)
    writer = models.ForeignKey(Writer)
    number = models.PositiveSmallIntegerField(default=0)

Here is my preview.py

class EventUpdateFormPreview(FormPreview):
    form_template = "app/event_update.html"
    preview_template = "app/event_update_preview.html"

    def get_initial(self, request):
        event = Event.objects.get(id=self.state["event_id"])
        return {
        'name': event.name,
        'writer': [x.pk for x in event.writer.all().order_by('attend__number')],
        }

Here is my forms.py

class EventUpdateForm(forms.ModelForm):
    name = forms.CharField(label='event name')
    writer = forms.ModelMultipleChoiceField(
    label='Attends',
    queryset=Writer.objects.all(),
    widget=autocomplete.ModelSelect2Multiple(
        url='app:writer_autocomplete',
        )
    )

Registration order in datababase

  1. Writer Mr.A(pk=1)
  2. Writer Mr.B(pk=2)
  3. Writer Mr.C(pk=3)
  4. Writer Mr.D(pk=4)

The order of attendees in registered events(It will be successful at the initial registration)

  1. Writer Mr.D(pk=4)
  2. Writer Mr.A(pk=1)
  3. Writer Mr.C(pk=3)

The order displayed on the update view

  1. Writer Mr.A(pk=1)
  2. Writer Mr.C(pk=3)
  3. Writer Mr.D(pk=4)

Environment:
Django==1.11.6
django-autocomplete-light==3.2.10

Please excuse my poor English, Thank you so much.

shad0w_wa1k3r
  • 12,955
  • 8
  • 67
  • 90
nau
  • 31
  • 3
  • You can give the order of items in the ModelMultipleChoiceField.queryset ``` queryset=Writer.objects.all().order_by('-name') ``` – mithuntnt Feb 20 '19 at 11:52

0 Answers0