Django - UpdateView ModelForm 在查询集字段上设置初始值

比尔·阿姆斯特朗

我正在尝试更新一个模型对象,其中一个值来自查询集。对象创建工作完美 - 它使用传递给模板的查询集,然后在 POST 时将其保存到对象中。

我的问题:named 字段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>

我确实遇到过这个问题,但它使用了一个单独的过滤器类——我希望在__init__.

很有可能我的问题实际上出在模板中 - 我遇到了这个,但仍然宁愿管理ModelForm.

后续问题:

或者...是否可以将初始值与其他所有内容一起传递到模板中,然后将其编码到模板中?

更新我

我几乎想通了 - 这是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()我已经包含'jury_name'两次以使列表项工作。只有一个值,下面的模板会抛出 err: 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

我该如何解决?

更新二

我在下面的回答是错误的......虽然删除{{ item }}标签实际上确实改变了选项以仅包含一组选择 - 它没有在 POST 中传递 - 相反,我在 POST 报告中得到了这个:

parent_jury         '<option value='

所以,越来越近 - 视图是正确的,但所选的选项没有被传回。

更新三

为模板找到了正确的构造...答案已更新:

可以在此处找到模板的原始 SO 答案

比尔·阿姆斯特朗

最后一块是在模板中。

原代码如下:

<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>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django ModelForm从其他字段生成字段

来自分类Dev

Django:具有唯一字段的UpdateView

来自分类Dev

Django ModelForm不显示字段错误

来自分类Dev

如何在Django modelform中隐藏字段?

来自分类Dev

在CreateView中设置Django ModelForm的字段值

来自分类Dev

Django相关模型和UpdateView字段

来自分类Dev

在Django ModelForm中动态更改字段选择

来自分类Dev

django ModelForm DateField初始值不起作用

来自分类Dev

Django删除UpdateView中的内联表单集记录

来自分类Dev

外键作为初始值未传递到Django的ModelForm

来自分类Dev

django modelform属性隐藏字段

来自分类Dev

Django UpdateView禁用某些字段

来自分类Dev

Django动态表单集UpdateView不更新

来自分类Dev

Django ModelForm初始或自定义字段值

来自分类Dev

无法在Django 1.5上实例化ModelForm

来自分类Dev

Django:具有相同名称的初始modelform字段

来自分类Dev

Django1.6 UpdateView,如何显示字段而不更新它

来自分类Dev

在CreateView中为Django ModelForm设置字段的值

来自分类Dev

Django中的UpdateView问题

来自分类Dev

NoReverseMatch 错误 Django - UpdateView

来自分类Dev

Django UpdateView:要更新的对象没有值

来自分类Dev

Django UpdateView 不使用 ModelForm 保存新用户还是现有用户

来自分类Dev

Django如何在单个modelForm中排除字段,仅用于updateview而不是createview?

来自分类Dev

Django 图像字段无法通过 ModelForm 分配

来自分类Dev

Django ModelForm 不显示所有字段

来自分类Dev

django:基于 ModelForm 字段创建 HTML 警报?

来自分类Dev

Django ModelForm 不检索字段的值

来自分类Dev

传递给其他 UpdateView 的 Django UpdateView 初始参数

来自分类Dev

将查询集添加到 django updateview

Related 相关文章

热门标签

归档