2010-03-10 37 views
8

Bunun gibi bir şeyin oluşturulmasını otomatikleştirmeye çalışıyorum:Django: django formunu kullanarak HTML giriş dizisi oluştur

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

Formdaki bir aralıkta dolaşarak. Bazı diğer varyasyonlarla birlikte böyle şeyler deniyorum:

# 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> 

Fakat hiç şansım olmadı.

Bir giriş dizisini otomatikleştirme hakkında nasıl gidebilirim?

** edit ** Açıklamak gerekirse, şablondaki alanlara şu şekilde erişebilmem gerekir:

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

Bu, umarım bana yukarıda gösterilen orijinal giriş listesini getirir.

+0

Kişisel döngüye hepsini sarma şablondan ayrı ayrı h Formset, sadece geçersiz etiketi ile yeni Charfield yaratıyor ve üzerine yazma self.field [ 'asdf'] (bir tamsayı olamaz). Yapmaya çalıştığın şeyin ne olduğundan emin değilim. Seçenek özelliğini kullanmaktan hoşlanıyor musunuz? –

+0

Yea, bu belirli sürümü sadece üzerine yazar. Listeler ve/veya sözlükler oluşturmaya çalışılmadan önce daha karmaşık bir kodum vardı ama onları da işe alamadım. – Brant

+0

Belki de etiketinizi 'asdf' ya da başka bir şey haline getirebilir, sonra tüm alanlardan geçebilir, '{% ifequal field.label' asdf '%} 'eşleştiğinde çıktı alabilir ve sonra 1, 2 değerini göstermek için forloop.counter işlevini kullanabilirsiniz. , 3, vb. Aşağıda cevabımı güncelledim. işe yarayabilecek –

cevap

1

daha örneğin gibi olmalıdır:

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

Ama çok elde etmek istediğinize bağlıdır.

+0

ben outputted zaman alanları farklı adlara sahip istemiyoruz. – Brant

+1

Farklı alan adlarını istemediğiniz belirli bir neden var mı? Sadece merak. –

+0

@Brant: Eh tabii ki bir sözlük, bir anahtar için birden fazla değer içeremez.Kodunda sadece tekrar ve tekrar alanı geçersiz kılıyorsun. –

7

Jacob Kaplan-Moss (Django yazarlarından) geçtiğimiz günlerde tercih edilen bir şekilde sorunu çözmek gerekir dinamik formlar, işleme için harika bir makale yayınladı: http://jacobian.org/writing/dynamic-form-generation/

O Felix anlaşılacağı aynı yöntemi kullanıyor, ama kavram üzerinde daha iyi bir kavrayış elde etmek için bütün makaleyi okumaya değer.

asdf[] tekniğini kullanmak özendiricidir, çünkü sipariş vermeniz gerekir. Aynı zamanda standart uygulama değildir.

Düzenleme:

size bu dinamik alanlar vurduğunda algılamak gerekir durumu idare etmek için: Ben formunu kırarak yapmam gereken ne yapabiliriz gibi

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

Aslına bakılırsa, bu şeylerin kurulumunu yaptım. Maalesef, oldukça benim ihtiyaçlarına hizmet etmez. Asdf [] girişleri başlamadan önce eklemem gereken bir açıklama metni paragrafı var ... ve asdf [] girişlerinin sayısı dinamik olmalı. Yani, o zaman hepsini tükürmek, asdf girişler, başlamak bir paragraf göstermek üzere olduğunu tespit edebilmek için gereklidir. – Brant

+1

+1 Bağlandığınız güzel yazı. –

+0

Makale Özeti: Form sınıfınızın ağır kaldırmasını sağlar. Harika okuma. – Seth