【问题标题】:django modelformset_factory doesn't include actual formsdjango modelformset_factory 不包含实际表单
【发布时间】:2016-10-29 23:41:18
【问题描述】:

我一直在尝试关注教程和其他 SO 问题,并有一个 modelformset_factory 显示 html 中看起来像表单的列表,但事实证明它们不是实际的表单。

显示的html:

<div ='container'>

        <div class='row'><tr><th><label for="id_form-0-config_key">Config key:</label></th><td><input id="id_form-0-config_key" maxlength="63" name="form-0-config_key" type="text" value="ClientMustVerify" /></td></tr>
<tr><th><label for="id_form-0-config_value">Config value:</label></th><td><input id="id_form-0-config_value" maxlength="63" name="form-0-config_value" type="text" value="TRUE" /><input id="id_form-0-id" name="form-0-id" type="hidden" value="3" /></td></tr> <input type="submit" value="Update" /></div>

        <div class='row'><tr><th><label for="id_form-1-config_key">Config key:</label></th><td><input id="id_form-1-config_key" maxlength="63" name="form-1-config_key" type="text" value="Auditing" /></td></tr>
<tr><th><label for="id_form-1-config_value">Config value:</label></th><td><input id="id_form-1-config_value" maxlength="63" name="form-1-config_value" type="text" value="FALSE" /><input id="id_form-1-id" name="form-1-id" type="hidden" value="4" /></td></tr> <input type="submit" value="Update" /></div>

    <div>

请注意,任何地方都没有form 标签。向后工作,这是模板的摘录:

<div ='container'>
    {% for form in formset %}
        <div class='row'>{{form}} <input type="submit" value="Update" /></div>
    {% endfor %}
<div>

是的,我手动添加了submit 按钮,希望这些按钮能够正常工作,但当然,如果没有form 标记,那么submit 按钮将不起作用。 视图.py:

from limbo.models import serverConfig
from django.forms import modelformset_factory
from django.forms import formset_factory

def editServer(request):
    result = serverConfig.objects.values()
    myConfigs = [entry for entry in result]

    finalFormSet = modelformset_factory(serverConfig, exclude=('id',), extra=0)
#other lines
    return render(request, 'limboHtml/ServerConfiguration.html', {'formset': finalFormSet, 'SubmitMessage': '', 'CurrentConfigs': myConfigs})

forms.py:

class serverForm(ModelForm):
    class Meta:
        model = serverConfig
        fields = ['config_key', 'config_value']
    def __init__(self, *args, **kwargs):
        super(serverForm, self).__init__(*args, **kwargs)
        instance = getattr(self, 'instance', None)
        if instance and instance.pk:
            self.fields['config_key'].widget.attrs['readonly'] = True
            self.fields['config_key'].widget.attrs['disabled'] = True

和models.py:

class serverConfig(models.Model):

    config_key = models.CharField(max_length=63)
    config_value = models.CharField(max_length=63)

我曾一度尝试使用finalFormSet = formset_factory(serverForm, extra=0),但后来我的 html 中没有任何内容...

【问题讨论】:

  • 此时,我只是在{{form}}&lt;/form&gt; 之前手动添加&lt;form method="post" &gt;{% csrf_token %},但希望有更内置的方式...

标签: python django forms django-forms


【解决方案1】:

formset documention 中所述,您必须手动添加表单标签。这与您在显示单个表单时所做的并没有太大区别。

您似乎正在遍历表单集并一一显示它们。这意味着您还必须添加管理表单

<form method="post" action="">
    {{ formset.management_form }}
    <div ='container'>
        {% for form in formset %}
            <div class='row'>{{form}} <input type="submit" value="Update" /></div>
        {% endfor %}
    <div>
</form>

否则您将收到有关缺少或配置错误的管理表单的错误。

【讨论】:

  • 谢谢,显然我错过了文档的那一部分。我已经看到它显示表单标签并使用更简单的表单自动提交,所以我假设(总是很糟糕)这会是相似的。
【解决方案2】:

请注意,它不包括标签或提交按钮。我们必须自己在模板中提供这些内容。

阅读更多:Working with Forms: Building a form in Django

您没有得到&lt;form&gt; 标记的原因是,从逻辑的角度来看,表单验证可以在您的应用程序的任何地方处理。这就是为什么需要用目标url(好用reverse(view_name))、方法等参数显式指定form标签。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多