编辑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
任何帮助将不胜感激,无论是得到上面的代码工作或通过提供更好的方式来做到这一点!
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它一定要得到它的工作。
不隶属于 StackOverflow