我正在尝试自动创建这样的东西:
<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 %}
然后有希望得到上面显示的原始输入列表......
答案 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)