【问题标题】:How to prefill django form Dynamically如何动态预填充django表单
【发布时间】:2021-12-29 09:11:08
【问题描述】:

我正在尝试在 django 中显示一个表单并动态预填充它。 我希望我的示例新闻收集网站的用户修改条目。

我有我的手动输入表单类

#forms.py
class ManualInputForm(forms.Form):
    source = forms.CharField(label="Source:", widget = forms.TextInput(attrs={'size': 97}))
    topic  = forms.CharField(label="Topic:", widget = forms.TextInput(attrs={'size': 97}))
    news   = forms.CharField(widget = forms.Textarea(attrs={"rows":5, "cols":100}))
    link   = forms.CharField(label="Link (optional):", required = False, widget = forms.TextInput(attrs={'size': 97}))

在 HTML 中我将手动进行,因为我想使用来自views.py 中相关函数的数据预填充所有字段。

#html file
<form method="post" class="form-group">
    {% csrf_token %}
    <div class="input-group mb-3">
        <div class="container">
            {% for field in form  %}
                <div class="fieldWrapper">
                    {{ field.errors }}
                    {{ field.label_tag }}
                    <br>
                    {{ field }}
                </div>
            {% endfor %}
        </div>

        <div class="input-group">
            <p> </p>
            <button type="submit" class="btn btn-success" name="Submit">Save</button>
        </div>
    </div>
</form>

我该怎么做?快把我逼疯了o.O 我想继续使用 django 的表单,因为它集成了错误管理器(并非所有字段都是必需的,但有些字段是必需的,我希望 django 继续管理它)。

感谢您的建议!

编辑: 根据要求,我将发布 views.py 相关功能:

#views.py
def editnews(response, id):
    form = ManualInputForm(response.POST or None)

    #tableToView is a dataframe retrieved by querying an external DB
    #data cannot be stored in django's buit in because of reasons ;-)

    #checking the dataframe is correct and it is:
    #IT IS MADE OF A SINGLE LINE
    
    print(tableToView)

    #THIS IS PROBABLY NOT THE WAY TO DO IT
    form.source = tableToView.loc[0, 'Source']
    form.topic  = tableToView.loc[0, 'Topic']
    form.news   = tableToView.loc[0, 'News']
    form.link   = tableToView.loc[0, 'Link']

    return render(response, 'manual/editnews.html', {"form":form})

图像中的文本应预先填充。

【问题讨论】:

  • 我把 javascript 作为一个标签,因为也许它可以用 lil' 脚本来实现。但我真的不知道(我是这个新的“网络”事物的新手 ;-)
  • 你能用views.py的相关部分更新你的帖子吗?
  • 按照建议更新帖子

标签: javascript python django


【解决方案1】:

试试这样的:

def editnews(response, id):
    data = {k.lower(): v for k, v in tableToView.loc[0].to_dict().items()}
    form = ManualInputForm(response.POST or None, initial=data)
    return render(response, 'manual/editnews.html', {'form': form})

【讨论】:

  • 不幸的是,html中的字段仍然是空的
  • 处理案例:sourceSource 不同
  • @Wing。我更新了我的答案,你能检查一下吗?
  • 准确!标签有一个大写字母,而实际变量是小写的这一事实让我感到困惑
【解决方案2】:

当您在视图中声明或呈现表单并将其发送到模板时。使用初始参数并在其中传递字典,其中键作为字段名称,值作为您要预填充的文本。

像这样 context['form'] = NameofForm(initial={'Source':'mysite', 'Topic':'mytopic'}) 返回上下文

更新

> def test_view(request, pk):   
>     template_name = 'form.html'
>     form = MyForm(initial={"test":"initialize with this value"})
>         if request.method == 'POST':
>             form = MyForm(request.POST)
>             if form.is_valid():
>                 form.save()
>                 return HttpResponseRedirect(reverse('list-view'))
> 
>     return render(request, template_name, {'form': form})

【讨论】:

  • 好的...我如何从 HTML 中获取它?
  • 你不需要。这就是它的美妙之处。但是请记住在 get 方法中声明 initial 而不是在 post 中声明。查看我的初始答案更新
  • 好的,我正在尝试测试它...reverse('list-view') 是什么?
  • 好的。它是列表视图的 url 的名称。提交表单后,我将用户重定向回列表视图。
【解决方案3】:

试试这个:


#views.py
def editnews(response, id):
    data = {}
    data["source"] = tableToView.loc[0, 'Source']
    data["topic"] = tableToView.loc[0, 'Topic']
    data["news"] = tableToView.loc[0, 'News']
    data["link"] = tableToView.loc[0, 'Link']

    form = ManualInputForm(response.POST or None, initial=data)

    return render(response, 'manual/editnews.html', {"form":form})

【讨论】:

    【解决方案4】:

    如果您使用 jQuery,您可以使用 jQuery 来实现。您需要将 id 的属性设置为表单字段。

    jQuery 代码示例:

    $('#topic').val("Prefilled text goes here");

    【讨论】:

      猜你喜欢
      • 2012-07-20
      • 2013-05-23
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 2010-10-06
      • 2020-04-13
      • 2017-06-28
      • 2010-10-30
      相关资源
      最近更新 更多