Django ModelForm에서 ForeignKey 선택 필터링하기
Django ModelForm에서 ForeignKey 선택 필터링하기
Django ModelForm에서 ForeignKey 필드의 선택 항목을 필터링하려면 어떻게 해야 할까요?
해결책:
Django ModelForm에서 ForeignKey 필드의 선택 항목을 필터링하려면 다음 두 가지 방법 중 하나를 사용할 수 있습니다.
ModelChoiceField의 queryset 속성 사용:
from django.forms import ModelChoiceField
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = ModelChoiceField(
queryset=MyModel.objects.filter(is_active=True)
)
위 코드에서는 foreign_key
필드의 선택 항목이 is_active
필드가 True
인 모델 인스턴스만 포함하도록 필터링됩니다.
form_init 메서드 사용:
from django.forms import ModelForm
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
def form_init(self, *args, **kwargs):
super().form_init(*args, **kwargs)
self.fields['foreign_key'].queryset = MyModel.objects.filter(is_active=True)
위 코드에서는 form_init
메서드를 사용하여 foreign_key
필드의 선택 항목을 필터링합니다.
참고:
queryset
속성을 사용하는 방법은 더 간단하고 직관적이지만,form_init
메서드를 사용하는 방법은 더 많은 유연성을 제공합니다.queryset
속성을 사용하는 경우, 필터링 조건은 모델 클래스에 직접 정의됩니다. 반면에form_init
메서드를 사용하는 경우, 필터링 조건을 동적으로 정의할 수 있습니다.
추가 정보
예시
다음은 위의 두 가지 방법을 사용하여 ForeignKey 선택 항목을 필터링하는 예시입니다.
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = ModelChoiceField(
queryset=MyModel.objects.filter(is_active=True)
)
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
def form_init(self, *args, **kwargs):
super().form_init(*args, **kwargs)
self.fields['foreign_key'].queryset = MyModel.objects.filter(is_active=True)
예제 코드
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = ModelChoiceField(
queryset=MyModel.objects.filter(is_active=True)
)
위 코드는 다음과 같이 작동합니다.
MyModel
클래스는name
과is_active
라는 두 개의 필드를 가진 모델을 정의합니다.MyForm
클래스는MyModel
모델을 기반으로 하는 ModelForm을 정의합니다.foreign_key
필드는ModelChoiceField
필드로 정의됩니다.ModelChoiceField
필드의queryset
속성은is_active
필드가True
인 모델 인스턴스만 포함하도록 설정됩니다.
이 코드를 실행하면 foreign_key
필드는 is_active
필드가 True
인 모델 인스턴스만 표시합니다.
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
def form_init(self, *args, **kwargs):
super().form_init(*args, **kwargs)
self.fields['foreign_key'].queryset = MyModel.objects.filter(is_active=True)
추가 정보
ForeignKey 선택 필터링을 위한 대체 방법
from django.forms import ModelChoiceField
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = ModelChoiceField(
choices=[
(1, 'Option 1'),
(2, 'Option 2'),
(3, 'Option 3'),
]
)
위 코드에서는 foreign_key
필드의 선택 항목을 직접 정의합니다.
get_form_kwargs 메서드 사용:
from django.forms import ModelForm
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
def get_form_kwargs(self, *args, **kwargs):
kwargs = super().get_form_kwargs(*args, **kwargs)
kwargs['foreign_key'].queryset = MyModel.objects.filter(is_active=True)
return kwargs
위 코드에서는 get_form_kwargs
메서드를 사용하여 foreign_key
필드의 queryset
속성을 동적으로 설정합니다.
커스텀 필드 위젯 사용:
from django.forms import ModelChoiceField, Select
class MyModelChoiceField(ModelChoiceField):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.widget = Select(attrs={'class': 'custom-class'})
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = MyModelChoiceField(
queryset=MyModel.objects.filter(is_active=True)
)
위 코드에서는 커스텀 필드 위젯을 사용하여 foreign_key
필드의 선택 항목을 표시하는 방식을 customize 할 수 있습니다.
어떤 방법을 사용해야 할까요?
사용해야 할 방법은 특정 요구 사항에 따라 다릅니다.
- 간단한 필터링:
ModelChoiceField
의queryset
속성을 사용하는 것이 가장 간단합니다. - 동적 필터링:
get_form_kwargs
메서드를 사용하면queryset
속성을 동적으로 설정할 수 있습니다. - 커스터마이징: 커스텀 필드 위젯을 사용하면 선택 항목을 표시하는 방식을 customize 할 수 있습니다.
참고
예시
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=False)
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'foreign_key']
foreign_key = ModelChoiceField(
choices=[
(1, 'Option 1'),
(2, 'Option 2'),
(3, 'Option 3'),
]
)
ModelChoiceField
필드의choices
속성은 직접 정의됩니다
python django django-forms