12

사용자 목록이 선택된 페이지를 만들려고합니다. 사용자가 선택하면 해당 사용자에게 일부 작업이 적용됩니다. 나는 테이블에 나열된 사용자를 가지고 있고이 테이블의 마지막 열이 그 체크 박스가되고 싶어요 내 템플릿에서템플릿에 django 양식 필드를 렌더링하는 방법

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

: 나는이처럼 보이는 폼 클래스를 만들었습니다. 그들의 이름에 따라 하나씩 필드를 렌더링해야합니다. 내가 필요한 양식 요소의 HTML 코드 반환 템플릿 태그를 만드는 시도 :

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

그러나, 이것은에 그 위젯을 결합하지 않습니다 마지막으로

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

을, 여기에 템플릿 코드입니다 양식을 제출 한 후 유효성 검사가 실패합니다. 모든 사용자 정의 필드가 필요하다는 오류 메시지가 표시됩니다. 그래서 여기 내 질문은 :

  1. 별도의 양식 필드를 렌더링하는 올바른 방법은 무엇입니까?

  2. 체크 박스가있는 양식을 만드는 올바른 방법은 무엇입니까? (어쩌면 의미 내 방법은 바보이고 내가 원하는 것을 달성 훨씬 쉬운 방법이있다.

+0

어쩌면 작은 자바 스크립트로 이것을 시도해야합니다. – unni

+0

나는이 단계에서 내 프로젝트에서 자바 스크립트를 사용하고 싶지 않았다. 그러나 정확히 무엇을해야합니까? 또는 나는 무엇을 google해야 하는가? 당신은 내가 거대한 자바 스크립트 pro = 아니란 것을 안다.) –

답변

8

확인 별도의 양식 필드를 올바르게 렌더링하는 방법을 찾았습니다. 나는 장고 소스를 보는 것을 발견했다. Django.forms.forms.BaseForm 클래스는 _html_output 메서드를 사용하여 Django.forms.forms.BoundField의 인스턴스를 생성 한 다음 unicode(boundField)을 html 출력에 추가합니다. 나는 똑같은 일을했고, 그것은 완벽하게 작동 : POST 요청 정확히 같은 모양과 형태가 제대로 처리 될 것 같은 {{form.as_p}} 그래서 같은 HTML을 생성

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

. 어떤 자바 스크립트없이,

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

지금은 계획대로 작동하는 것 같다 :

나는 또한 내 양식 클래스의 몇 가지 실수를 고정.

+3

[소스 코드] (https://github.com/django/django/blob/master/django/forms/forms.py#L108) 읽기 BoundField를 사용하는 대신 청소기로 form [key ]'그리고 당신은 같은 BoundField를 얻습니다. –

12

당신은 너무 복잡 템플릿을 만들고있어. 당신이 그것을 만들 때 각 필드에 레이블 추가 폼의 __init__ 방법.

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

그럼 그냥 형태의 필드 돌이와 더 이상 userlist에 대해 걱정하지 마십시오. 내가 생각하는 그래서

+0

불행히도, 나는 이것을 할 수 없다. 예제를 명확히하기 위해 코드를 단순화했습니다. 이 체크 박스가있는 테이블 행에는 두 개 이상의 열이 있으며 체크 박스 ("선택 방법", 모든 사용자를 선택하거나 확인란 만 선택)를 선택하는 다른 위젯이 있습니다. 어쩌면 나는 그것들을 분리 된 형태로 나누어야 할 것인가?그것은 형태의'get_selected' 메소드의 인 캡슐 레이션을 풀지 만, 작업을 간단하게 만들 수 있습니다.? –

관련 문제