12

Bir kullanıcı seçiliyse, seçilen kullanıcılara bazı eylemler uygulanacaksa, işaret eden kullanıcıların ve onay kutularının bulunduğu bir sayfa yapmak istiyorum. Bir tabloda listelenen kullanıcımız var ve ben bu tablonun son sütunu bu onay kutularını olmak istiyorum benim şablonundaŞablonda django form alanı nasıl oluşturulur

#in forms.py 
class UserSelectionForm(forms.Form): 
    """form for selecting users""" 
    def __init__(self, userlist, *args, **kwargs): 
     self.custom_fields = userlist 
     super(forms.Form, self).__init__(*args, **kwargs) 
     for f in userlist: 
      self.fields[str(f.id)] = forms.BooleanField(initial=False)  

    def get_selected(self): 
     """returns selected users""" 
     return filter(lambda u: self.fields[str(u.id)], self.custom_fields) 

: ben şöyle bir form sınıfı yarattı. Adlarına bağlı olarak alanları birer birer oluşturmalıyım. ihtiyacım form öğesinin html kodunu dönmek bir şablon etiketi oluşturma çalıştı:

<form action="" method="post"> 
{% csrf_token %} 
<table class="listtable"> 
    <tr> 
    <th>Username</th> 
    <th>Select</th> 
    </tr> 
{% for u in userlist %} 
    <tr> 
    <td>{{u.username}}</td> 
    <td>{{select_form|user_select_field:u.id}}</td> 
    </tr> 
{% endfor %} 
</table> 
<p><input type="submit" value="make actions" /></p> 

Ancak bu için bu widget bağlamak değil: Son olarak

#in templatetags/user_list_tags.py 
from django import template 
register = template.Library() 

#this is django template tag for user selection form 
@register.filter 
def user_select_field(form, userid): 
    """ 
    returns UserSelectionForm field for a user with userid 
    """ 
    key = std(userid) 
    if key not in form.fields.keys(): 
     print 'Key %s not found in dict' % key 
     return None 
     return form.fields[key].widget.render(form, key) 

, burada şablon kodu formu ve böylece formu teslim ettikten sonra doğrulama başarısız olur. Hata mesajı, tüm özel alanların gerekli olduğunu söylüyor. Yani benim sorular şunlardır:

  1. ayrı form alanları işlemek için doğru yolu nedir?

  2. Onay kutularıyla böyle bir form oluşturmanın doğru yolu nedir? (Belki demek benim yöntem aptal ve ne istediğimi elde etme çok daha kolay bir yolu yoktur.

+0

Belki bunu biraz javascript ile yapmayı deneyin. – unni

+0

Bu aşamada projemde javascript kullanmak istemedim. Ancak, tam olarak ne yapmalıyım? Ya da google ne yapmalıyım? Biliyorsun ben büyük bir javascript değil pro =) –

cevap

8

Tamam Ayrı form alanlarını doğru şekilde oluşturmanın bir yolunu buldum. Onu django kaynaklarını izledim. Django.forms.forms.BaseForm sınıfı, Django.forms.forms.BoundField örneğini oluşturan _html_output yöntemine sahiptir ve daha sonra html çıktısına unicode(boundField) ekler. Ben aynı şeyi yaptı ve mükemmel çalıştı: POST isteği tam olarak aynı bakacağız ve form doğru bir şekilde işleyecek şekilde {{form.as_p}}, bu nedenle aynı html oluşturulan

#in templatetags/user_list_tags.py 
from django import template 
from django import forms 
register = template.Library() 

#this is djangp template tag for user selection form 
@register.filter 
def user_select_field(form, userid): 
    """ 
    returns UserSelectionForm field for a user with userid 
    """ 
    key = str(userid) 
    if key not in form.fields.keys(): 
     print 'Key %s not found in dict' % key 
     return None 
    #here i use BoundField: 
    boundField = forms.forms.BoundField(form, form.fields[key], key) 
    return unicode(boundField) 

. herhangi javascript olmadan

#in UserSelectionForm definition: 
... 
#__init__ 
for f in userlist: 
    self.fields[str(f.id)] = forms.BooleanField(initial=False, required=False) 
#get_selected  
return filter(lambda u: self.cleaned_data[str(u.id)], 
    self.custom_fields) 

şimdi planlandığı gibi iş gibi görünüyor:

Ben de benim form sınıfındaki bazı hatalar düzeltildi.

+3

[Kaynak kodu] 'nı okuma (https://github.com/django/django/blob/master/django/forms/forms.py#L108) BoundField kullanmak yerine, form [key] yapmak için daha temiz olduğunu buldum ] ve aynı BoundField'ı elde edersiniz. –

12

Sen çok karmaşık bir şablon yapıyoruz. Eğer bunu oluştururken her alan bir etiket ekleme formun __init__ yöntemi.

for f in userlist: 
    self.fields[str(f.id)] = forms.BooleanField(label=f.username, initial=False) 

Sonra sadece formda alanlar üzerinde döngü ve artık userlist dert etmeyin. bence Yani

+0

Ne yazık ki, bunu yapamam. Örneği temizlemek için kodumu biraz basitleştirdim. Benim sürüm tablomda bu onay kutusunun ikiden fazla sütunu var ve onay kutularının yanı sıra (tüm kullanıcıları seçmek için hava durumunu seçebileceğim veya yalnızca onay kutuları tarafından seçilebilen "seçim yöntemi") başka bir widget var. Belki de hepsini ayrı formlarda bölmeyi denemeliyim?'Get_selected' yönteminin kapsüllemesini kaybedecek, ancak görevi basitleştirebilir. –

İlgili konular