Dav*_*idM 7 python django django-forms django-admin 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
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激,要么上面的代码工作或提供更好的方法来做到这一点!
DavidM
没有自动发生任何事情的原因是“projects”字段不是标签模型的一部分。这意味着您必须自己完成所有工作。类似于(以 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)
Run Code Online (Sandbox Code Playgroud)
请注意,该代码未经测试,因此您可能需要对其进行一些调整才能使其正常工作。
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |