programing tip

Django ModelChoiceField : 쿼리 세트 필터링 및 기본값을 객체로 설정

itbloger 2021. 1. 7. 07:43
반응형

Django ModelChoiceField : 쿼리 세트 필터링 및 기본값을 객체로 설정


Django Form 클래스가 다음과 Models같이 정의되어 있습니다 .

class AccountDetailsForm(forms.Form):
    ...
    adminuser = forms.ModelChoiceField(queryset=User.objects.all())

이것은 정상적으로 작동하지만 몇 가지 제한 사항이 있습니다.

(1) 다음과 같이 accountid양식에 전달 된 변수를 기반으로 쿼리 세트에 필터를 사용하고 싶습니다.

User.objects.filter(account=accountid)

accountid물론 변수로 전달할 수 없기 때문에 모델에서 작동 하지 않습니다.

것을 다음 queryset필수가 어떻게 든 정의 할 수 Views있지만, 지금까지의 내가 볼 수는 Form 클래스에서 필요한 필드입니다.

(2) AccountDetailsForm데이터베이스에서 개체 의 기본 선택을 하고 Views싶습니다. 다음과 같이 선택할 수 있습니다 .

User.objects.filter(account=accountid).filter(primary_user=1)

양식의 기본값으로 adminuser를 지정해 보았습니다 (같은 다른 표준 양식 필드에서 작동 함 CharField).

adminuser = User.objects.filter(account=accountid).filter(primary_user=1)

...

form = AccountDetailsForm({'adminuser': adminuser})
return render_to_response('accounts/edit/accountdetails.html', 
{'form': form, 'account':account})

하지만 운이 없습니다.

ModelChoiceField여기에 필요한 유연성 외에 다른 것을 사용해야합니까 ?

감사.


init 메서드를 재정의하고 새 키워드 인수를 수락합니다.

class AccountDetailsForm(forms.Form):
    ...
    adminuser = forms.ModelChoiceField(queryset=User.objects.all())
    def __init__(self, *args, **kwargs):
        accountid = kwargs.pop('accountid', None)
        super(AccountDetailsForm, self).__init__(*args, **kwargs)

        if accountid:
            self.fields['adminuser'].queryset = User.objects.filter(account=accountid)

form = AccountDetailsForm(accountid=3)

보기에서도 항상 수동으로 선택 사항을 설정할 수 있습니다.

form = AccountDetailsForm()
form.fields['adminuser'].queryset = User.objects.filter(account=accountid)

경고하십시오 : 예제와 같이 사전을 양식에 전달하여 기본값을 설정 하지 않습니다 .

실제로 Bound Form을 만들고 잠재적으로 유효성 검사와 모든 재즈를 트리거합니다.

기본값을 설정하려면 initials 인수를 사용하십시오.

form = AccountDetailsForm(initial={'adminuser':'3'})

보기에서 필드를 재정의 할 수 있습니다.

yourForm = AccountDetailsForm()

yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1))

In Django 2.0 you can pass object (User in your case) from the view to the form like this (you have to retrieve obj from the DB first):

form = AccountDetailsForm(initial={'adminuser': adminuser})

It will give you a default selected object (answers your 2) question)

ReferenceURL : https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj

반응형