Django форма для сохранения дополнительных полей m2m (с использованием пользовательской сквозной / промежуточной модели) - PullRequest
0 голосов
/ 31 марта 2020

У меня есть модель "Родитель", которая содержит несколько моделей "Дочерний", и отношения между Родителем и Дочерним хранят порядок дочерних элементов. Таким образом, мне нужна пользовательская промежуточная модель.

models.py:

class Parent(models.Model):
    name = models.CharField
    children = models.ManyToManyField(Child, through=ParentChild)
    ...

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

class ParentChild(model.Model):
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    child = models.ForeignKey(Child, on_delete=models.CASCADE)
    order_of_child = IntegerField(null=True, blank=True, unique=True, default=None) 

Родительский объект создается на основе формы, и выбираются дочерние объекты, которые должны быть частью родительского объекта. по флажкам. Теперь мои вопросы: как можно включить order_of_child в форму и отобразить вместе с флажками и как правильно сохранить отношения в представлении?

forms.py:

class ParentForm(ModelForm):

    class Meta:
        model = Parent
        fields = ['name', 'children']

    def __init__(self, *args, **kwargs):
        super(ParentForm, self).__init__(*args, **kwargs)
        self.fields['name'] = forms.CharField(label='Name', widget=forms.TextInput()
        self.fields['children'] = ModelMultipleChoiceField(
                                      widget=forms.CheckboxSelectMultiple(queryset=Child.objects.all())

1 Ответ

0 голосов
/ 31 марта 2020

Чтобы сохранить отношение, вы сначала создаете и сохраняете Parent, затем от l oop до form.cleaned_data['children'], чтобы создать каждый экземпляр ParentChild, назначая индекс l oop в качестве порядка.

Теперь для заказа, что более сложно, вам понадобится виджет, который позволит вам изменить порядок выбора, поэтому значение по умолчанию CheckboxSelectMultiple не будет работать, потому что оно этого не делает. Для этого вам понадобится javascript: скопируйте выбранные опции в новый div, где пользователь может перетаскивать и изменять порядок, например, используя библиотеку, такую ​​как jquery .ui.sortable или sortableJS / сортировка . С javascript вы заполняете скрытое поле с выбранными значениями в правильном порядке, что вы и отправляете в конце.

Существует также специальный django сортируемый мультиселект поле который я не пробовал (использует jqueryUI для сортировки).

...