Редактирование обеих сторон M2M на странице администратора
-
19-09-2019 - |
Вопрос
Сначала я выложу, чего я пытаюсь достичь, если есть другой способ сделать это!
Я хочу иметь возможность редактировать обе стороны отношения M2M (предпочтительно на странице администратора, хотя, если это может быть на обычной странице) с использованием любого из нескольких отдельных интерфейсов.
Проблема, очевидно, идет с обратной стороной, так как основная сторона (где определяется отношения) работает автоматически.
Я попробовал некоторые советы здесь, чтобы появиться в линии, и это работает, но это не очень хороший интерфейс.
Совет, который я получил в списке рассылки Django, заключался в том, чтобы использовать пользовательский Modelform. У меня есть до того, как появится многоцелевая коробка, но она, кажется, не «подключена» к чему -либо, поскольку она не начинается ни с чего выбранного и не сохраняет никаких изменений, которые внесены.
Вот соответствующие фрагменты кода:
#models.py
class Tag(models.Model):
name = models.CharField(max_length=200)
class Project(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
tags = models.ManyToManyField(Tag, related_name='projects')
#admin.py
class TagForm(ModelForm):
fields = ('name', 'projects')
projects = ModelMultipleChoiceField(Project.objects.all(), widget=SelectMultiple())
class Meta:
model = Tag
class TagAdmin(admin.ModelAdmin):
fields = ('name', 'projects')
form = TagForm
Любая помощь будет высоко оценена, либо получение приведенного выше кода, либо предоставление лучшего способа сделать это!
Дэвидм
Решение
Причина, по которой ничто не происходит автоматически, заключается в том, что поле «Проекты» не является частью модели тега. Это означает, что вы должны выполнять всю работу самостоятельно. Что -то вроде (в тегформе):
def __init__(self, *args, **kwargs):
super(TagForm, self).__init__(*args, **kwargs)
if 'instance' in kwargs:
self.fields['projects'].initial = self.instance.project_set.all()
def save(self, *args, **kwargs):
super(TagForm, self).save(*args, **kwargs)
self.instance.project_set.clear()
for project in self.cleaned_data['projects']:
self.instance.project_set.add(project)
Обратите внимание, что код не проверен, поэтому вам может потребоваться его немного, чтобы заставить его работать.