在管理页面中编辑M2M的两面

时间:2009-11-09 10:27:46

标签: python django django-admin django-forms m2m

首先,我会列出我想要达到的目标,以防万一有不同的方法可以实现它!

我希望能够使用任何多选接口编辑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 个答案:

答案 0 :(得分:2)

自动没有任何反应的原因是“projects”字段不是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)

请注意,代码未经测试,因此您可能需要对其进行调整以使其正常工作。