【问题标题】:Retrieve variable from instance of Django form从 Django 表单的实例中检索变量
【发布时间】:2019-12-30 04:50:02
【问题描述】:

我有一个 Django 表单 NameForm。我正在尝试遍历一组值,并且对于每个值,都可以选择显示相同的表单。唯一应该随着表单提交而改变的应该是表单旁边显示的关联值。

举个例子就更清楚了。对于一些数组[1,2,3],我们应该显示:

然后我们可以点击任何open form 图标,填写NameForm 表格。结果信息,包括form_id(在本例中为1, 2, or 3)应返回到forms.py。如何从 index.py 中的NameForm 实例中获取form_id 变量?

我的(hacky)尝试可以在下面找到。问题是我不知道如何访问我在NameForm 对象中创建的form_id 变量。

forms.py

class NameForm(forms.Form):
    form_id = None
    your_name = forms.CharField(label='Your name', max_length=3)

views.py

def index(request):
    if request.method == 'POST':
        form = NameForm(request.POST)
        form_id = form.form_id # The problem line, as form_id is always None
        if form.is_valid():
            return HttpResponse( \
            ' '.join((str(form.cleaned_data['your_name']),form_id ))\
            ) #Throws TypeError as can't join None and string
    else:
        forms = []
        vals = [1,2,3]
        for val in vals:
            form = NameForm()
            form.form_id = val
            forms.append(form)
    return render(request, 'post/index.html', {'forms': forms})

index.html

    {%for form in forms%}
    {{form.form_id}}
    <button class="button" onclick="openForm()">Open Form</button>
    <div class="myForm">
        <form class="form-container" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit">
        <button class="button" onclick="closeForm()">Cancel</button>
        </form>
    </div>
    </br>
    {%endfor%}

【问题讨论】:

    标签: python html django django-forms


    【解决方案1】:

    在 Django Form 或 Django Model 中,当您将字段的值设置为 None 时,假定您要忽略该字段。这在创建从另一个模型继承的模型并且您想要删除一些不必要的字段时很有帮助。

    如果要在创建表单时为字段设置值,则应将其传递给__init__ 方法。例如:

    class NameForm(forms.Form):
        form_id = forms.IntegerField(widget=forms.HiddenInput())
        your_name = forms.CharField(label='Your name', max_length=3)
    
        def __init__(self, form_id, *args, **kwargs):
            self.fields['form_id'].initial = form_id
    

    或者,您可以在创建NameForm 的实例时为form_id 设置一个初始值,而不是覆盖__init__ 方法。例如:

    vals = [1,2,3]
    forms = [NameForm(initial={'form_id': val}) for val in vals]
    

    【讨论】:

    • 感谢您的回复!这样做的问题是用户可以编辑form_id 字段。当然可以将form_id 的定义更改为forms.IntegerField(widget=forms.HiddenInput()),但这仍然不起作用,因为结果form_id 值始终为vals[0]
    • 我看不到您如何设置表单并在视图中使用它的详细信息。但在我这边,我仍然可以从客户端发送正确的form_idform = NameForm(request.POST) if form.is_valid(): print(form.cleaned_data['form_id'])。我的模板和视图和你的一样。
    • 你是对的!问题是我必须将打开哪个表单传递给我的js 代码。转义 html 和 js 很痛苦,但如果有人好奇,语法是:onclick= "openForm('{{form.form_id.value|escapejs}}'); "
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多