2009-08-12 2 views
2

저는 현재 문제가있어 매우 사소한 것을 간과 할 가능성이 있습니다. 내 모델에는 체크 박스 양식을 통해 여러 선택 항목을 허용해야하는 필드가 있습니다 (최종 사용자가 볼 수있는 양식 영역의 관리 화면에서 확인란이 될 필요는 없습니다). 현재 내가 필드 설정과 같이이 있습니다Django ModelForm CheckBox 위젯

# Type of Media 
MEDIA_CHOICES = (
    ('1', 'Magazine'), 
    ('2', 'Radio Station'), 
    ('3', 'Journal'), 
    ('4', 'TV Station'), 
    ('5', 'Newspaper'), 
    ('6', 'Website'), 
) 
media_choice = models.CharField(max_length=25, 
    choices=MEDIA_CHOICES) 

내가 그를 가지고 있지만 그것의 형태로 체크 박스 선택 필드를 확인해야합니다. ModelForm을 만들 때 드롭 다운 상자를 원합니다. 그래서 자연스럽게 그 필드를 무효화하고, 내가 원하는 체크 박스를 얻습니다. 그러나 양식이 제출되면 관리 화면을 볼 때 유용한 내용이 저장되지 않은 것처럼 보입니다. 그러나 데이터베이스는 내가 선택한 것들이 여러 개 있다는 것을 보여 주지만 긍정적 인 신호이다. 그러나 어떻게하면 관리 화면에 제대로 반영 할 수 있습니까?

편집 : FWIW 문서 링크를 대답으로 기꺼이 받아 들일 것입니다.

답변

15

그런 경우 가장 쉬운 방법은 선택 사항을 별도의 모델에 넣은 다음 ManyToMany 관계를 사용하는 것입니다. 그 후, 해당 필드의 ModelForm 위젯을 오버라이드하여 forms.CheckboxSelectMultiple을 사용하면 Django가 자동으로 올바른 작업을 수행합니다. CharField를 사용하기를 원한다면 아마도 this snippet과 같은 것을해야 할 것입니다.

@ 2. 댓글 : 위젯을 어떻게 오버라이드합니까? 난 그냥 ModelForms와 위젯 할당을 조사하기 시작했습니다

class SomeModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(SomeModelForm, self).__init__(*args, **kwargs) 
     self.fields['some_field'].widget = forms.CheckboxSelectMultiple() 
+0

팁 주셔서 감사합니다. ManyToMany를 사용하고 싶지 않았습니다. 왜냐하면 항상 정적 인 정보를 위해 약 6 개의 모델을 만들려고했기 때문입니다. 불필요한 것으로 보입니다. – f4nt

+2

또한 fwiw, 작동하지 않는 것 같습니다. CheckBoxSelectMultiple 폼을 사용할 때 필드가 공백으로 렌더링됩니다. MultipleChoiceField를 사용하는 경우 Checkbox widget이 작동합니다. 그러나 선택 목록이있는 양식을 제공해야합니다. 그런 다음 오버라이드 된 정리 기능으로 데이터를 다시 매핑해야합니다. 어쩌면 그게 올바른 방법 일 수도 있지만 잘못된 느낌이 들며 일반적으로 어떤 것이 "잘못 느껴질 때"입니다. 내가 여기서 과용하지 않는다는 것을 증명하려고 노력한다. Models.py에서 : MEDIA_TYPE = models.ManyToManyField (MediaChoice) Forms.py에서 : 데프 __init__ – f4nt

+0

잘 나는 그러나 지금은이 있고, 바로이 날을 설정 주셔서 감사합니다, 그래서 바로 그 일을하지 않은 (self, * args, ** kwargs) : super (MediaContactForm, self) .__ init __ (* args, ** kwargs) self.fields [ 'media_type']. 위젯 = forms.CheckboxSelectMultiple() – f4nt

1

: 이것은 내가 그것을하고 완벽하게 작동하는 방법입니다. piquadrat가 포함 된 많은 예에서 Form의 __ init __ 메소드가 무시되었습니다.

나는이 약간의 혼란을 발견하고 바로 원하는 필드를 무시하는 것은 나를 위해 더 자연스러운 :

class SomeModelForm(forms.ModelForm): 
    some_field = forms.CharField(choices=MEDIA_CHOICES, 
           widget=forms.CheckboxSelectMultiple) 
    class Meta: 
     model=SomeModel 

참고 : 나는 장고 1.1을 사용하고 있습니다.

0

piquadrat의 대답을 사용하면 나를 위해 효과적 이었지만 M2M에 대한 쿼리 세트를 정의하는 라인을 추가해야했습니다. this link을 참조하십시오.