Я создаю Form
, у которого есть ModelChoiceField
. Я могу установить значения для этого поля следующим образом:Установить начальное значение для динамически созданного ModelChoiceField в представлении на основе классов
class DeviceForm(Form):
devices = ModelChoiceField(queryset=None, widget=RadioSelect, empty_label=None)
def __init__(self, *args, **kwargs):
super(DeviceForm, self).__init__(*args, **kwargs)
user_id = kwargs['initial']['user_id']
devices = Device.objects.filter(user_id=user_id, is_validated=True)
self.fields['devices'].queryset = devices
Это прекрасно работает, но я не могу показаться, чтобы быть в состоянии установить начальное значение. Я попробовал несколько вещей, такие как добавление начального значения get_initial()
:
def get_initial(self):
initial = super(DeviceView, self).get_initial()
initial['user_id'] = self.kwargs['user_id']
default_device = Device.objects.get(user_id=self.kwargs['user_id'], is_validated=True, is_default=True)
initial['devices'] = default_device.id
return initial
Но это не работает. Я пришел через несколько вопросов на StackOverflow, которые Instantiate формы и передают в начальном значении следующим образом:
#Get default device
form = DeviceForm(initial={'devices': default_device.id})
Но в идеале я хотел бы избежать этого, так как я пытаюсь придерживаться общей базы Джанго просмотров (которые выглядят как это, и не позволяют за initial
kwarg, насколько я знаю):
def get(self, request, user_id, **kwargs):
# Do stuff
form = self.get_form()
return self.render_to_response(self.get_context_data(form=form))
Установка устройства в get_initial()
должны работать, так как self.get_form_kwargs()
возвращается:
{'prefix': None, 'initial': {'user_id': u'1', 'devices': 42}}
или, в зависимости от того, что я должен выбрать:
{'prefix': None, 'initial': {'user_id': u'1', 'devices': <Device: Device object>}}
Выполнение следующих до сих пор не получить его на работу (в основном то же самое, get_form()
вручную).
def get(self, request, user_id, **kwargs):
#Do stuff
form_class = self.get_form_class()
form = form_class(**self.get_form_kwargs())
return self.render_to_response(self.get_context_data(form=form))
Установка начального значения в конструкторе формы также не работает:
class DeviceForm(Form):
devices = ModelChoiceField(queryset=None, widget=RadioSelect, empty_label=None)
def __init__(self, *args, **kwargs):
super(DeviceForm, self).__init__(*args, **kwargs)
user_id = kwargs['initial']['user_id']
devices = Device.objects.filter(user_id=user_id, is_validated=True)
self.fields['devices'].queryset = devices
default_device = devices.filter(is_default=True)
self.fields['devices'].initial = default_device # or default_device.id
Кто-нибудь знает, как это сделать?
Пожалуйста, покажите свое мнение. – Alasdair