从 Django 表单的实例中检索变量

Posted

技术标签:

【中文标题】从 Django 表单的实例中检索变量【英文标题】:Retrieve variable from instance of Django form 【发布时间】: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%

【问题讨论】:

【参考方案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'); "

以上是关于从 Django 表单的实例中检索变量的主要内容,如果未能解决你的问题,请参考以下文章

在 django 中检索表单字段属性

如何将从表单提交中检索到的参数作为参数传递给 django 中的函数

如何在html中检索Django表单对象以便以后使用AJAX

从 Django HTML 表单中检索数据并将其传递给 MySQL 数据库

将模板变量从 URL 传递到 Django 中的 FormPreview

将变量从视图传递到表单 Django