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
- Writer Mr.A(pk=1)
- Writer Mr.B(pk=2)
- Writer Mr.C(pk=3)
- Writer Mr.D(pk=4)
The order of attendees in registered events(It will be successful at the initial registration)
- Writer Mr.D(pk=4)
- Writer Mr.A(pk=1)
- Writer Mr.C(pk=3)
The order displayed on the update view
- Writer Mr.A(pk=1)
- Writer Mr.C(pk=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.