ManyToManyField を持つ Django モデルがあります。
1) 管理者ビューからこのモデルの新しいインスタンスを追加するとき、M2M フィールドをまったく表示したくありません。
2) 既存のインスタンスを編集するとき、M2M フィールドの複数のオプションを選択できるようにしたいのですが、モデル内の別のフィールドに応じて、M2M オプションのサブセットのみを表示したいと考えています。別のフィールドの実際の値に依存しているため、 formfield_for_manytomany だけを使用することはできません
カスタム ModelForm を使用して両方のことを実行できますが、そのフォームが既存のモデル インスタンスの編集に使用されているのか、それとも新しいインスタンスの作成に使用されているのかを確実に判断することはできません。カスタム ModelForm の MyModel.objects.filter(pk=self.instance.pk).exists() でさえ、それをカットしません。どうすればこれを達成できますか、またはフォームが「追加」または「編集」コンテキストで表示されているかを知ることができますか?
編集:私の関連コードは次のとおりです:
models.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 = []
admin.py
class ClassAdmin(admin.ModelAdmin):
formfield_overrides = {models.ManyToManyField: {
'widget': CheckboxSelectMultiple}, }
form = LimitedClassForm
admin.site.register(Class, ClassAdmin)
models.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)
シートとクラスの両方にコース フィールドがあることがわかります。シートのコースがクラスのコースと一致しない場合、シートを active_sheets に入れることはできません。