使用JavaScript& amp;动态地将字段添加到Django表单JSONField

时间:2012-02-08 15:16:40

标签: javascript django django-forms

我有一个模型表单,我需要在一个东西旁边存储未知数量的助手。名称可以在保存时序列化,这不是问题。它能够在提交时清理并验证它们。

表格看起来像;

class ThingForm(forms.ModelForm):
    """
    Form for the Thing
    """
    owner = forms.CharField()
    helpers = forms.CharField()

    class Meta:
        model = Thing

    def save(self, *args, **kwargs):
        """
        Serialize helpers to JSON.
        """
        ...

模型正在使用JSONField存储序列化助手。

class Thing(models.Model):
    owner = models.CharField()
    helpers = JSONField()

我有JavaScript添加尽可能多的帮助器,具有相同的输入名称:

<input name="helpers" value="Fred" />
<input name="helpers" value="Joe" />

哪个正在返回助手的元组。 问题是如果表单无效 - 这些名称将丢失并且清理工作无效。

我的第一个想法是添加到表单的构造函数:

    def __init__(self, *args, **kwargs):
        super(ThingForm, self).__init__(*args, **kwargs)
        try:
            helpers = args[0].pop('helpers')
            for name in helpers:
                # Add a charfield, or something?
        except:
            pass

但我真的没有到达任何地方......

3 个答案:

答案 0 :(得分:1)

感谢AdamKG获得答案。您可以再次使用视图中的列表:

查看:

if request.method == 'POST':
    helpers = request.POST.getlist('helpers')
    form = ThingForm(request.POST)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/saved/')
else:
    helpers = None
    form = ThingForm()

return render_to_response('my_template.html',
    {'helpers': helpers, 'form': form},
    context_instance=RequestContext(request))

模板:

{% for field in form %}
    {% if field.name == 'helpers' %}
        {% for name in helpers %}
            <input name="helpers" value="{{ name }}" />
        {% endfor %}
    {% else %}
        {{ field }}
    {% endif %}
{% endfor %}

答案 1 :(得分:0)

我认为您需要做的就是在模板中执行以下操作:

{% if form.data %}{# eg, was invalid and this is a re-render w/ errors #}
{% for helper in form.data.helpers %}
<input type="hidden" name="helpers" value="{{ helper }}">
{% endfor %}
{% endif %}

请注意,如果您开始将prefix kwarg传递给您的表单,这将会中断 - 但原始代码也是如此,修复这是一个单独的问题:)

答案 2 :(得分:0)

我们遇到了类似的问题,但没有找到解决方案。所以我们做了我们的(https://github.com/vialink/vlk-django-jsonfield)。