gpt4 book ai didi

python - 在管理页面中编辑 M2M 的两侧

转载 作者:太空狗 更新时间:2023-10-29 21:57:36 26 4
gpt4 key购买 nike

首先,我将列出我要实现的目标,以防有不同的方法!

我希望能够使用任何多选界面编辑 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

任何帮助将不胜感激,要么让上面的代码工作,要么提供更好的方法!

大卫M

最佳答案

没有自动发生的原因是“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)

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

关于python - 在管理页面中编辑 M2M 的两侧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1700202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com