Редактирование обеих сторон M2M на странице администратора

StackOverflow https://stackoverflow.com/questions/1700202

Вопрос

Сначала я выложу, чего я пытаюсь достичь, если есть другой способ сделать это!

Я хочу иметь возможность редактировать обе стороны отношения 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)

Обратите внимание, что код не проверен, поэтому вам может потребоваться его немного, чтобы заставить его работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top