Django ModelChoiceField: фильтрация набора запросов и установка значения по умолчанию в качестве объекта



у меня есть класс формы Django, определенный как это в Models:



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


это работает нормально, но у него есть некоторые ограничения, которые я не могу обойти:



(1) я хотел бы использовать фильтр на queryset, основанный на переменной accountid перешел к форме, вот так:



User.objects.filter(account=accountid)


это не может работать в модели, потому что accountid не может быть передан как переменная, конечно.



следует, что queryset должны каким-то образом быть определены в Views, но насколько я вижу, это обязательное поле в классе формы.



(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 дали гибкость мне нужна здесь?



спасибо.

1084   3  

3 ответов:

переопределите метод 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)

будьте осторожны: вы не установка значений по умолчанию путем передачи словаря в форму, как в вашем примере.

вы на самом деле создаете связанную форму, потенциально вызывая проверку и весь этот джаз.

чтобы установить значения по умолчанию,использовать инициалы аргумент.

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

вы можете переопределить поле в виде

yourForm = AccountDetailsForm()

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

в Django 2.0 вы можете передать объект (User в вашем случае) от view до form вот так (сначала вы должны получить obj из БД):

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

это даст вам выбранный по умолчанию объект (ответы на ваш 2) вопрос)

Comments

    Ничего не найдено.