Django:使用django表单创建HTML输入数组

时间:2010-03-10 19:57:42

标签: python django django-forms

我正在尝试自动创建这样的东西:

<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />
<input type='text' name='asdf[]' />

通过表单中的范围循环。我一直在尝试这样的事情,还有其他一些变化:

# in a model class
for i in range(1, prim+1):
    self.fields['asdf'] = forms.CharField(label=i)

# in the template
<form action='#' method='post'>
    {{form.as_p}}
</form>

但我没有运气。

如何自动化输入数组?

**编辑** 为了澄清,最终我需要能够访问模板中的字段,如下所示:

{% for input in form.fields.asdf %}
{{input}}
{% endfor %}

然后有希望得到上面显示的原始输入列表......

4 个答案:

答案 0 :(得分:8)

Jacob Kaplan-Moss(Django的合着者)最近发表了一篇关于处理动态表单的精彩文章,它应该以一种优先的方式解决你的问题: http://jacobian.org/writing/dynamic-form-generation/

他使用了与Felix建议的方法相同的方法,但是为了更好地掌握这个概念,值得阅读整篇文章。

使用asdf[]技术是草率的,因为那时你必须处理订购。这也不是标准做法。

修改

要处理您需要检测何时触及这些动态字段的情况:

{% for input in form.fields %}
    {% ifequal input.label 'asdf' %}
        {{ forloop.counter }}: {{input}}<br />
    {% endifequal %}
{% endfor %}

答案 1 :(得分:1)

应该更像是例如:

# in a model class
for i in range(1, prim+1):
    self.fields['asdf_%s' % i] = forms.CharField(label='Label %i' % i)

但这很大程度上取决于你想要达到的目标。

答案 2 :(得分:1)

看起来我可以通过将表单分成多个表单集来完成我需要做的事情......

http://docs.djangoproject.com/en/dev/topics/forms/formsets/#topics-forms-formsets

然后,我应该能够从模板中单独访问每个formset,将所有formset包装成一个

答案 3 :(得分:0)

您可能想尝试以下方法:

form_view.html

add_filter( 'woocommerce_catalog_orderby', 'hugo_boss_catalog_orderby' );
function hugo_boss_catalog_orderby( $orderby ) {
    $orderby['featured'] = __('Featured', 'woocommerce');

    return $orderby;
}

add_action( 'woocommerce_product_query', 'obama_trump_product_query' );
function obama_trump_product_query( $q ) {
    if ( ! is_admin() && isset($_GET['orderby']) && 'featured' === esc_attr($_GET['orderby']) ) {
        $tax_query = $q->get('tax_query');
        $tax_query[] = array(
            'taxonomy' => 'product_visibility',
            'field'    => 'name',
            'terms'    => 'featured',
        );
        $q->set( 'tax_query', $tax_query );
        $q->set( 'order', 'DESC' ); // Or "ASC"
    }
}

views.py

<!-- simple form page -->
<form action="{{ request.path }}" method="post">
  {{ form }}
</form>

models.py

# Some form controller
class DynamicFormView(FormView):
   form_class = DynamicForm
   template_name = "form_view.html"

   def get_form_kwargs(self):
        kwargs = super(DynamicFormView, self).get_form_kwargs()
        # Decide on a number of dynamic fields
        # to pass into the form
        # i.e. form(num_products=5)
        kwargs['num_products'] = 5  
        return kwargs

forms.py

# A model
class Company(models.Model):
    name = models.CharField(max_length=200)

# A model with a many to one relationship with another model
class Product(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)