Django에서 ModelChoiceField의 queryset을 필터링하는 방법 질문 드립니다.

Trim 생성 form에서, 전체가 아니라 특정 Car에 대한 TrimType 목록만 나오게 하고 싶습니다.
ImgurImgur

  • 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 오후