【问题标题】:Is it possible to instantiate a formset which isn't call with {{ formset.as_p }}?是否可以实例化不使用 {{ formset.as_p }} 调用的表单集?
【发布时间】:2016-06-08 02:48:21
【问题描述】:

我调用了一个表单集,但没有使用{{ formset.as_p }},因为我想更改表单的显示。 我知道在使用{{ formset.as_p }} 时可以实例化一个字段来直接编辑它。

但是这样可以使用表单集吗

<form method="POST" action="">
    {{ formset.management_form }} {% csrf_token %}
    <table>

      <!-- <br>{{ formset.as_p }}<br> -->

      {% for question in questions %}<hr>

    <label for="question">{{ question }} [{{ question.id }}]</label>  
    <input type="hidden" id="id_form-{{ forloop.counter0 }}-question" name="form-{{ forloop.counter0 }}-question" value="{{ question.id }}"/>

  </p>    
    <p>
    <label for="answer">Answer :</label>
    <input type="text" id="id_form-{{ forloop.counter0 }}-answer" name="form-{{ forloop.counter0 }}-answer" placeholder="answer here"/>
    <input type="hidden" id="id_form-{{ forloop.counter0 }}-id" name="form-{{ forloop.counter0 }}-id" value="{{ reply.id }}"/>
    </p>
{% endfor %}

 </table>
    <center><input type="submit" value="Submit" class="btn btn-success" />
    <a href="../../baseVisite/" class="btn btn-success">Retour</a></center>
  </form>

我希望我可以实例化字段答案。

我尝试传入这样的值:

{% for reply in question.reply_set.all %}
    <p>
    <label for="answer">Réponse :</label>
    <input type="text" id="id_form-{{ forloop.parentloop.counter0 }}-answer" name="form-{{ forloop.parentloop.counter0 }}-answer" value="{{ reply.answer }}"/>
    <input type="hidden" id="id_form-{{ forloop.parentloop.counter0 }}-id" name="form-{{ forloop.parentloop.counter0 }}-id" value="{{ reply.id }}"/>
    </p>
  {% endfor %}

但是这样做只是初始化值并且不允许修改

有办法用这个表单集结构做我想做的事吗?

编辑:

class ReplyForm(forms.ModelForm):

    def __init__(self, page_id, *args,**kwargs):
        super (ReplyForm,self ).__init__(*args,**kwargs)
        self.fields['question'].queryset = Question.objects.filter(page=page_id)

    class Meta:
        model = Reply
        exclude = ('user','creationDate')

【问题讨论】:

    标签: python django django-forms formset


    【解决方案1】:

    如果我没听错的话,您想自定义使用表单集呈现的表单的视图。当然,您可以这样做,因为 formset 只是一组表单。手动渲染formset,同时使用form

    <form method="post" action="">
        {{ formset.management_form }}
        <table>
            {% for form in formset %}
                {{ form.non_field_errors }}
                <div class="fieldWrapper">
                    {{ form.subject.errors }}
                    <label for="{{ form.subject.id_for_label }}">Email subject:</label>
                    {{ form.subject }}
                </div>
                <div class="fieldWrapper">
                    {{ form.message.errors }}
                    <label for="{{ form.message.id_for_label }}">Your message:</label>
                    {{ form.message }}
                </div>
                # more fields
            {% endfor %}
        </table>
    </form>
    

    如果您有多个项目字段(在您的情况下为question),您可以迭代它们并手动渲染:

    {% for field in form.question %}
        <div class="fieldWrapper">
            {{ field.errors }}
            <label for="{{ field.id_for_label }}">Some label:</label> {{ field }}
        </div>
    {% endfor %}
    

    【讨论】:

    • 我想像我已经做的那样自定义我的表单集,但我不能做的是完成一个预字段(字段实例化)来编辑它。这次通过自定义表单集我不能改变价值……只加一个
    • 我怎样才能让他明白"id_for_label"必须是我每个问题的标签?
    • 啊,现在我明白了。你试过我的解决方案吗? id_for_label 选项应该自动传递与相关 field 相同的 id。请展示您的表单是什么样子的,它是 ModelForm 吗?
    • 所以您在一个字段中有多个项目。检查更新的答案。
    • @chemist 我不想改变我的结构我只是希望它不是添加新值而是让我(如果有的话)数据库中的响应值能够稍后更改!
    猜你喜欢
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2016-04-10
    • 2013-08-06
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多