【问题标题】:Django form is not rendered properly after setting initial values dynamically动态设置初始值后,Django 表单无法正确呈现
【发布时间】:2015-04-02 15:44:38
【问题描述】:

我正在尝试呈现一个表单,其中多个字段根据从视图传递到表单的参数动态初始化。 我在表单的 init 方法中设置了初始值,只要考虑将值分配给字段元素,它似乎工作正常。 当我打印表单时,我可以看到那些附加到适当字段元素的值。 问题是这些值在渲染时没有显示出来。

我的观点是:

def zoneinfo(request):
    siteId = request.GET.get('siteId')
    form = PostForm(site = siteId.upper())
    print form
    return render(request, 'details.html', {'form': form})

form.py 中的代码

def __init__(self, *args, **kwargs):
    siteId =  kwargs.pop('site', None)
    super(PostForm, self).__init__(*args, **kwargs)
    if siteId:
        siteInfo = getSiteInfo(siteId.upper())
        self.fields['city'] = forms.CharField(max_length=25, initial=siteInfo['city'])
        self.fields['address'] = forms.CharField(max_length=25, initial=siteInfo['address'])
        self.fields['state'] = forms.CharField(max_length=50, initial=siteInfo['state'])
        self.fields['zip'] = forms.CharField(max_length=10, initial=siteInfo['zip'])

details.html:

{% load staticfiles %}
<form action = "/zones/add" id="addNewZoneForm1" method='post'>{% csrf_token %}
<!-- <form  id="addNewSite" method='post'>{% csrf_token %} -->
    <fieldset>
        <table border="0" cellspacing="2" cellpadding="2" width="100%">
            {{ form.as_table }}
      <!-- Allow form submission with keyboard without duplicating the dialog button -->
      </table>
      <input type="submit" value="Submit">
    </fieldset>


</form>
<script type="text/javascript">
        function getSite(value){
        $.ajax({
             url: "sites/getinfo?siteId="+value,
             type: "get",
        })
    }
</script>

打印表单返回的位置:

<tr><th><label for="id_site">Site:</label></th><td><select id="id_site" name="site" onChange="getSite(this.value);">
<option value="initialValue">----Select Site----</option>
<option value="abc">ABC</option>
<option value="xyz">XYZ</option>
</select></td></tr>
<tr><th><label for="id_city">City:</label></th><td><input id="id_city" maxlength="25" name="city" type="text" value="SAN" /></td></tr>
<tr><th><label for="id_address">Address:</label></th><td><input id="id_address" maxlength="25" name="address" type="text" value="SAN" /></td></tr>
<tr><th><label for="id_state">State:</label></th><td><input id="id_state" maxlength="50" name="state" type="text" value="SAN" /></td></tr>
<tr><th><label for="id_zip">Zip:</label></th><td><input id="id_zip" maxlength="10" name="zip" type="text" value="10000001" /></td></tr>
<tr><th><label for="id_description">Description:</label></th><td><textarea cols="40" id="id_description" name="description" rows="10">
</textarea></td></tr>

我们可以在 html 输出中看到字段具有关联的值,但它们没有在视图中呈现。 我没有收到任何错误,只是一个带有空字段的表单

编辑:我厌倦了在控制台上打印 return render(request, 'details.html', {'form': form}) 并且输出包含字段的值。不知道为什么这些值在网页上不可见。

提前感谢您的帮助

【问题讨论】:

  • 我尝试按照这些示例进行操作,但它不适用于成功的结果。我仍然面临同样的问题。此外,在初始化表单时定义这么多字段似乎有点奇怪。我也没有使用modelForms。这只是一种基本形式,不确定是否有影响
  • 您是否期望您的 Ajax getSite 调用更改您已经呈现的表单?
  • 我想要实现的是:在 html 页面上,用户将获得一个下拉列表来选择一个选项,根据该选项我想填充剩余的字段。所以我试图根据选择的下拉选项从数据库中获取数据,并且我成功了。但是表单不是基于新值呈现的。我想澄清的一个问题是我已经写了两个观点。第一个呈现普通形式。我在这里展示的第二个视图是应该使用更新值呈现的视图。
  • 是的,但是您的 JS 所做的只是对视图进行 GET。结果根本没有做任何事情。 JS 不会为你神奇地更新你的 HTML,你需要在你的 ajax 调用中定义一个成功方法并对结果做一些事情。

标签: django forms


【解决方案1】:

修改了 getSite 代码,它完全符合我的要求

<script type="text/javascript">
        function getSite(value){
        $.ajax({
             url: "/zones/info?siteId="+value,
             type: "get",
             success: function(data){
                $( "#content" ).html(data);
             }
        })
    }
</script>

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 1970-01-01
    • 2010-10-23
    • 2022-11-12
    • 2021-07-15
    • 1970-01-01
    • 2012-10-20
    • 2017-04-06
    • 2018-08-07
    相关资源
    最近更新 更多