2009-11-03 3 views
0

내가 jQuery를 FCBKcomplete 위젯과 다 대다 forms.SelectMultiple 필드를 대체하기 위해에 대한 사용자 정의 위젯을 쓰고 있어요 모델 양식을 손실없이 forms.SelectMultiple 확장. multiselect 요소의 교체가 제대로 작동하지만 더 이상 다중 선택 옵션을 사용하지 않습니다.는 값

<div class="field"> 
    <label for="name">Categories</label> 
    <select multiple="multiple" name="categories" id="id_categories"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 
<div class="field"> 
    <label for="name">Admins</label> 
    <select multiple="multiple" name="admins" id="id_admins"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 
<div class="field"> 
    <label for="name">Editors</label> 
    <select multiple="multiple" name="editors" id="id_editors"> 
    </select> 
    <div class="help-text">trimmed for readability</div> 
</div> 
:

여기
class Category(models.Model): 
    """A blog category""" 

    title = models.CharField(max_length=128) 
    slug = models.SlugField() 

    class Meta(object): 
     verbose_name_plural = u'Categories' 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('category',(), {'slug': self.slug}) 


class Blog(models.Model): 
    """A blog""" 

    title = models.CharField(max_length=128) 
    slug = models.SlugField(unique=True) 
    description = models.TextField() 
    categories = models.ManyToManyField(Category, related_name='blogs') 
    shared = models.BooleanField() 
    admins = models.ManyToManyField(User, related_name='blog_admins') 
    editors = models.ManyToManyField(User, related_name='blog_editors') 

    def __unicode__(self): 
     return self.title 

    @models.permalink 
    def get_absolute_url(self): 
     return ('blog',(), {'slug': self.slug}) 

는 결과 HTML입니다 : 여기

class BlogForm(forms.ModelForm): 
    class Meta(object): 
     model = models.Blog 
     exclude = ('slug',) 

    def __init__(self, *args, **kwargs): 
     super(BlogForm, self).__init__(*args, **kwargs) 
     self.fields['description'].widget = TinyMCEWidget() 

     fcbkcomplete_fields = ['categories', 'admins', 'editors'] 

     for field in fcbkcomplete_fields: 
      self.fields[field].widget = FCBKcompleteWidget() 

내 모델입니다 : 여기
class FCBKcompleteWidget(forms.SelectMultiple): 
    def _media(self): 
     return forms.Media(js=(reverse('appstatic', 
             args=['js/jquery.fcbkcomplete.min.js']), 
           reverse('appstatic', 
             args=['js/init-fcbkcomplete.js'])), 
          css={'all': (reverse('appstatic', 
               args=['css/jquery.fcbkcomplete' 
                 '.css']),)}) 

    media = property(_media) 

내 형태 : 여기

내 위젯입니다

보시다시피, multiselect 요소로 만드는 옵션은 없습니다. 나는 내 사용자 지정 하나 위젯을 대체하지 않는 경우 여기에 결과 HTML은 다음과 같습니다

<div class="field"> 
    <label for="name">Categories</label> 
    <select multiple="multiple" name="categories" id="id_categories"> 
    <option value="1" selected="selected">Good Stuff</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 
<div class="field"> 
    <label for="name">Admins</label> 
    <select multiple="multiple" name="admins" id="id_admins"> 
    <option value="2" selected="selected">username</option> 
    <option value="3">some username</option> 
    <option value="4">another username</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 
<div class="field"> 
    <label for="name">Editors</label> 
    <select multiple="multiple" name="editors" id="id_editors"> 
    <option value="2" selected="selected">username</option> 
    <option value="3">some username</option> 
    <option value="4">another username</option> 
    </select> 
    <div class="help-text">trimmed</div> 
</div> 

사람이 왜 옵션이 위젯 교체 프로세스를 통해 제작되지 않습니다에 관한 어떤 제안이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

양식이 ModelForm이므로 코드 모델이 유용합니다. – stefanw

+0

모델이 추가되었습니다. 감사. –

+0

해결 했습니까? 나는 비슷한 문제가있다. –

답변

0

1 년 통과하지만, 대답은 심지어 현재 장고 버전으로 도움이 될 수 있습니다. 그런 행동에 대한

이유는

class EmailSubscriptionFilterForm(forms.ModelForm): 

    class Meta: 
     model = EmailSubscription 
     exclude = ('dsts',) 

    def loc_name(self, id): 
     return Location.objects.get(id = id).name   

    def __init__(self, *args, **kwargs): 
     super(EmailSubscriptionFilterForm, self).__init__(*args, **kwargs) 
     fcbkcomplete_fields = ['orgs'] 
     for field in fcbkcomplete_fields: 
      self.fields[field].widget = MultiOriginSelect() 
     if args: 
      self.fields['orgs'].choices = ([(int(o), self.loc_name(int(o))) for o in args[0].getlist('orgs')]) 

이 그것을 선택 몸에 POST 요청과 함께 모든 옵션을 추가 할 것입니다, 초기화하기 위해서 양식에 선택을 밀어 fcbk 필드 에 대한 선택 속성을 누락 것 같다.