2009-11-09 3 views
7

Сначала я изложу, чего я пытаюсь достичь, если есть другой способ сделать это!Редактирование обеих сторон M2M в Admin Page

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

Любая помощь будет высоко ценится, либо получать код, чтобы работать или обеспечивая лучший способ сделать это!

DavidM

+1

Ничего себе, дружелюбные люди здесь, 11 минут и 2 голосов! – DavidM

ответ

2

Причина, почему ничего не происходит автоматически, что поле «проекты» не является частью модели Tag. Это означает, что вы должны выполнять всю работу самостоятельно. Нечто подобное (в 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) 

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

+0

Похоже, это может быть трюком, спасибо, но у меня проблема с этим. «instance» присутствует в kwargs, но установка начального значения, похоже, не имеет эффекта. Для проверки я попытался установить self.fields ['name']. Initial = 'test', и это также не отображается на интерфейсе. – DavidM

+0

Я помечаю это как ответ и продолжаю с ним обманывать. Если я его отсортирую, я отправлю ответ здесь. Благодаря! – DavidM

Смежные вопросы