0

我有一个带有 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。

4

0 回答 0