我有一个带有 ManyToManyField 的 Django 模型。
1) 通过管理视图添加此模型的新实例时,我不想看到 M2M 字段。
2)编辑现有实例时,我希望能够为 M2M 字段选择多个选项,但仅显示 M2M 选项的子集,具体取决于模型中的另一个字段。由于依赖于另一个字段的实际值,我不能只使用 formfield_for_manytomany
我可以使用自定义 ModelForm 来完成这两件事,但我无法可靠地判断该表单是用于编辑现有模型实例,还是用于创建新实例。甚至自定义 ModelForm 中的 MyModel.objects.filter(pk=self.instance.pk).exists() 也没有削减它。我怎样才能做到这一点,或者只是判断表单是显示在“添加”还是“编辑”上下文中?
编辑:我的相关代码如下:
模型.py
class LimitedClassForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(LimitedClassForm, self).__init__(*args, **kwargs)
if not self.instance._adding:
# Edit form
clas = self.instance
sheets_in_course = Sheet.objects.filter(course__pk=clas.course.pk)
self.Meta.exclude = ['course']
widget = self.fields['active_sheets'].widget
sheet_choices = []
for sheet in sheets_in_course:
sheet_choices.append((sheet.id, sheet.name))
widget.choices = sheet_choices
else:
# Add form
self.Meta.exclude = ['active_sheets']
class Meta:
exclude = []
管理员.py
class ClassAdmin(admin.ModelAdmin):
formfield_overrides = {models.ManyToManyField: {
'widget': CheckboxSelectMultiple}, }
form = LimitedClassForm
admin.site.register(Class, ClassAdmin)
模型.py
class Course(models.Model):
name = models.CharField(max_length=255)
class Sheet(models.Model):
name = models.CharField(max_length=255)
course = models.ForeignKey(Course)
file = models.FileField(upload_to=getSheetLocation)
class Class(models.model):
name = models.CharField(max_length=255)
course = models.ForeignKey(Course)
active_sheets = models.ManyToManyField(Sheet)
您可以看到 Sheets 和 Classes 都有课程字段。如果工作表的课程与班级的课程不匹配,您不应该将工作表放入 active_sheets。