Django에서 ModelChoiceField의 queryset을 필터링하는 방법 질문 드립니다.
Trim 생성 form에서, 전체가 아니라 특정 Car에 대한 TrimType 목록만 나오게 하고 싶습니다.
→ 
- models.py :
class Car(models.Model):
id = models.AutoField(primary_key=True)
name = ...
class TrimType(models.Model):
car = models.ForeignKey(Car, on_delete=models.SET_NULL)
typeName = ...
class Trim(models.Model):
id = models.AutoField(primary_key=True)
trimType = models.ForeignKey(TrimType, on_delete=models.SET_NULL)
car = models.ForeignKey(Car, on_delete=models.SET_NULL)
name = ...
- views.py :
def trim_create(request, car_id):
car = get_object_or_404(Car, pk=car_id)
if request.method == 'POST':
form = TrimForm(request.POST)
form.fields['trimType'].queryset = TrimType.objects.filter(car_id=car.id) # car.id인 trimType 필드 쿼리셋 필터링
if form.is_valid():
trim = form.save(commit=False)
trim.car = car
trim.save()
return redirect('trim_list', car_id=car_id)
else:
form = TrimForm()
context = {'form': form}
return render(request, 'trim_update.html', context)
- forms.py :
class TrimForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(TrimForm, self).__init__(*args, **kwargs)
class Meta:
model = Trim
fields = ('id', 'name', 'trimType', ... )
trimType = forms.ModelChoiceField(queryset=TrimType.objects.all())
이렇게 하고, 템플릿에서 {{ form.as_p }} 로 렌더링 했는데 여전히 trimType 목록 전체가 나오네요.. 어디가 잘 못 되었을까요??
제가 python이랑 django 공부한지 얼마 안돼서 아주 기초적인 걸 틀렸을 수도 있습니다..ㅎㅎ
sky123 님 934
M 2021년 8월 17일 10:01 오전
1개의 답변이 있습니다. 1 / 1 Page
trimType = forms.ModelChoiceField(queryset=TrimType.objects.all())
위처럼 TrimType.objects.all() 로 사용했으니 전부 보일것 같은데요?
박응용 님
2021년 8월 17일 2:55 오후