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:
ayrı form alanları işlemek için doğru yolu nedir?
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.
Belki bunu biraz javascript ile yapmayı deneyin. – unni
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 =) –