簡體   English   中英

使用JavaScript和JSONField動態地將字段添加到Django表單

[英]Adding fields to a Django form dynamically with JavaScript & JSONField

我有一個模型表單,我需要在一個東西旁邊存儲未知數量的助手。 名稱可以在保存時序列化,這不是問題。 它能夠在提交時清理並驗證它們。

表格看起來像;

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

但我真的沒有到達任何地方......

感謝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 %}

我們遇到了類似的問題,但沒有找到解決方案。 所以我們做了我們的( https://github.com/vialink/vlk-django-jsonfield )。

我認為您需要做的就是在模板中執行以下操作:

{% 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傳遞給表單,這將會中斷 - 但原始代碼也是如此,修復這是一個單獨的問題:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM