首先,我会制定出什么我想要实现的情况下,有一种不同的方式去了解它!

我想能够编辑的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

有帮助吗?

解决方案

为什么没有自动发生的原因是,“项目”字段是不是标签模型的一部分。这意味着你必须自己做所有的工作。类似的信息(在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)

请注意,该代码是未经测试的,所以你可能需要tweek它一定要得到它的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top