如何在django表单中为小部件提供自定义名称

如何在django表单中为小部件提供自定义名称,django,django-forms,Django,Django Forms,我有一个小部件 Comments = forms.CharField(max_length=100,required=True) 现在我想把上面的小部件放在一个循环中,这样它就必须 Comments_1 = forms.CharField(max_length=100,required=True) Comments_2 = forms.CharField(max_length=100,required=True) Comments_3 = forms.CharField(max_length

我有一个小部件

Comments = forms.CharField(max_length=100,required=True)
现在我想把上面的小部件放在一个循环中,这样它就必须

Comments_1 = forms.CharField(max_length=100,required=True) 
Comments_2 = forms.CharField(max_length=100,required=True)
Comments_3 = forms.CharField(max_length=100,required=True)  
....
....
....
现在,我在django模板中硬编码表单字段,如下所示 我只是想在django表格下面的形式

{% for question in questions %}
            <div class="well">    
                    <h3>{{ question|striptags }} </h3>
                    {% if question.enumComment == "1" %}
                        <br>


                                <textarea name="fill_apraisal_comment{{ question.intQuesID }}" rows="3" cols="40" class="form-control">
                                     {{fill_comments|keyvalue:question.intQuesID}}
                                </textarea> 


                   {% endif %}


            </div>
            {% empty %}
                <li>No Questions.</li>
        {% endfor %}
{%用于问题中的问题%}
{{问题|标签}
{%if question.enumComment==“1”%}

{{fill_comments}keyvalue:question.intQuesID} {%endif%} {%empty%}
  • 没有问题
  • {%endfor%}
    您可以执行以下操作:

    from django.utils import six
    from django.forms.forms import get_declared_fields
    from django.forms.widgets import media_property
    
    class IteratedFieldsMetaclass(type):
    
        def __new__(cls, name, bases, attrs):
    
            attrs['base_fields'] = get_declared_fields(bases, attrs)
    
            i = 0
            while i < 5:
                attrs['base_fields']['Comments_%s' % i] = forms.CharField()
                i = i + 1
    
            new_class = super(IteratedFieldsMetaclass,
                         cls).__new__(cls, name, bases, attrs)
            if 'media' not in attrs:
                new_class.media = media_property(new_class)
            return new_class
    
    class OrderForm(six.with_metaclass(IteratedFieldsMetaclass, forms.BaseForm)):
        pass
    

    像这样吗?

    确切地说,这些是“字段”:)您想要用于验证或呈现表单的字段吗?因为在模板中,您可以迭代表单字段。我希望该字段有我自己的自定义名称。字段必须是表单,具体取决于我给出的计数。实际上,我在数据库中有5个问题,问题id为。现在,我想为每个问题显示文本框。因此,每个文本框都应使用名称“textbox\u questionid”来形成如何使用视图和模板中的QuestionIteratedFieldsMetaclass?我可以形成文本框,但上面的代码无法验证。@user2627385我猜不出您打算如何使用它。也许再问一个问题?还是编辑这个?
    from models import Question
    
    class QuestionIteratedFieldsMetaclass(type):
    
        def __new__(cls, name, bases, attrs):
    
            attrs['base_fields'] = get_declared_fields(bases, attrs)
    
            for question in Question.objects.all():
                attrs['base_fields']['textbox_question%s' % question.id] = forms.CharField(label = question.question_text)
    
            new_class = super(QuestionIteratedFieldsMetaclass,
                         cls).__new__(cls, name, bases, attrs)
            if 'media' not in attrs:
                new_class.media = media_property(new_class)
            return new_class