Django - UpdateView ModelForm устанавливает начальное значение в поле набора запросов - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь обновить объект модели, где одно из значений получено из набора запросов.Создание объекта работает отлично - оно использует набор запросов, который передается в шаблон, а затем на 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-ответ для шаблона можно найти здесь .

1 Ответ

0 голосов
/ 10 июня 2018

Последняя часть была в шаблоне.

Исходный код гласил:

<option value="{{ item }}">{{ item }}</option>

В результате чего элемент value и элемент label были включены всписок опций.Так как оба имели одинаковое значение, они оба (thingy или другой thingy1) имели одинаковый результат в POST.Конструкцию для этого select/option/iteration можно найти здесь .

#update code
<tr><td>Parent Jurisdiction:</td><td><select name="parent_jury">
    {% for val, item in form.fields.parent_jury.choices %}
            <option value="{{ item }}"{% if form.fileds.parent_jury.value == val%} selected{% endif %}>{{ item }}</option>
    {% endfor %}
</select></td></tr>

В качестве последующего замечания, использование объекта набора запросов в опции требует обоих:

# passing queryset to select/option
<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>
...