Я пытаюсь обновить объект модели, где одно из значений получено из набора запросов.Создание объекта работает отлично - оно использует набор запросов, который передается в шаблон, а затем на POST сохраняется в объект.
Мой вопрос: поле с именем parent_jury
отображается в шаблоне какпустое поле выбора.Не содержит исходного значения поля.Как получить его, чтобы установить начальное значение поля на то, что находится в объекте, и позволить пользователю выбирать из других значений в наборе запросов?
Но теперь я пытаюсь update
объект.Вот код:
#forms.py
def __init__(self, *args, **kwargs):
pk = kwargs.pop('pk')
yr = kwargs.pop('yr')
jr = kwargs.pop('jr')
self.customer_id = pk
self.court_year_id = yr
super().__init__(*args, **kwargs)
# This prints the correct value for the the object I'm trying to update
print("pr: ", Jury.objects.get(
jury_id=jr).parent_jury)
# This is my latest attempt to get the initial value (or any value) to
# be presented in the modelform/template.
self.fields['parent_jury'].initial = Jury.objects.get(
jury_id=jr).parent_jury
Помимо приведенного выше кода, я также попытался получить правильные значения __init__()
, используя это:
#forms.py (other attempts)
self.fields['parent_jury'] = forms.ChoiceField(
required = False,
choices = Jury.objects.filter(
customer_id=pk).filter(
court_year_id = yr),
initial = Juriy.objects.get(
jury_id=jr).parent_jury)
Мой шаблон отражает мой шаблон createview (вероятно, это является причиной проблемы).
#template.html
<tr><td>Parent Jury:</td><td><select name="parent_jury">
{% for item in form.parent_jury.field.queryset %}
<option value="{{ item }}">{{ item }}</option>
{% endfor %}
</select></td></tr>
Я наткнулся на this , но он использует отдельный класс фильтра - я надеялся обработать в __init__
.
Существует большая вероятность того, что моя проблема на самом деле в шаблоне - я наткнулся на этот , но все равно предпочел бы управлять тем, что доставляется (и как) в пределах ModelForm
.
Дополнительный вопрос:
ИЛИ ... возможно ли передать начальное значение в шаблон со всем остальным, а затем закодировать его в шаблон?
Обновить I
Я почти понял это - вот forms.py
__ini__()
, который передаст правильное значение choices
шаблону:
def __init__(self, *args, **kwargs):
pk = kwargs.pop('pk')
yr = kwargs.pop('yr')
jr = kwargs.pop('jr')
self.customer_id = pk
self.court_year_id = yr
super().__init__(*args, **kwargs)
print("pr: ", Juriy.objects.get(
jury_id=jr).parent_jury)
choices = list(Jury.objects.filter(
client_id = pk).filter(
court_year_id = yr).values_list('jury_name', 'jury_name'))
print("choices: ", choices)
self.fields['parent_jury'] = forms.ChoiceField(
choices = choices,
)
В .values_list()
I 'мы включили 'jury_name'
дважды, чтобы заставить работать элемент списка.Только с одним значением шаблон ниже выдает ошибку: not enough values to unpack (expected 2, got 1)
.Прохождение два решает эту проблему.
В шаблонах, которые у меня есть:
<tr><td>Parent Jury:</td><td><select name="parent_jury">
{% for item in form.parent_jury %}
<option value="{{ item }}">{{ item }}</option>
{% endfor %}
</select></td></tr>
#output
Thingy1
Thingy1
Thingy2
Thingy2
Thingy3
Thingy3
Как видите, теперь проблема в том, что поле select/option
в форме фактически дублирует ключевые записи,Каждая клавиша отображается дважды в раскрывающемся меню.
Я также запустил следующий код в нижней части шаблона с правильным результатом:
{% for item in form.parent_jurisdiction %}
{{item}}
{% endfor %}
#output
Thingy1
Thingy2
Thingy3
Как это исправить?
Обновление II
Мой ответ ниже неправильный ... Хотя удаление метки {{ item }}
фактически меняет параметры, чтобы включить только один набор вариантов - он не проходит в POST - вместо этого я получаю это вотчет POST:
parent_jury '<option value='
Итак, приближение - представление верное, но выбранный вариант не возвращается.
Обновление III
Найденправильная конструкция для шаблона ... ответ обновлен:
Оригинальный SO-ответ для шаблона можно найти здесь .