forms.SelectMultiple de models.CommaSeparatedIntegerField

votos
0

Eu tenho um modelo com o campo:

class Movie(models.Model):
    genre = models.CommaSeparatedIntegerField(max_length=100, choices=GENRE_CHOICES, blank=True, default=0)
    lang = models.CommaSeparatedIntegerField(max_length=100, choices=LANG_CHOICES, blank=True, default=0)

E eu preciso para obter vários campos selecionados (não caixas de seleção) a partir daí.

Uma maneira que eu encontrei, é redefinir a forma de ModelAdmin

class MyMovieAdminForm(forms.ModelForm):
    genre = forms.MultipleChoiceField(choices=GENRE_CHOICES)
    lang = forms.MultipleChoiceField(choices=LANG_CHOICES)

class MovieAdmin(admin.ModelAdmin):
    form = MyMovieAdminForm

admin.site.register(Movie, MovieAdmin)

Mas é preciso redeclare 'label' e 'inicial' para cada campo, que não é bom para o princípio DRY. E eu não entendo, como posso definir o valor atual do objeto para o valor inicial de cada campo?

E outra maneira, que eu achei no manual é FormField-substituições . Eu uso a versão dev do tronco e eu tento usar esse código, mas não mudar meus selecione campos para multiselect na interface de administração:

class MovieAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CommaSeparatedIntegerField: {'widget': forms.SelectMultiple},
    }

Pode ser qualquer um sabe, qual é a melhor maneira de definir vários campos selecionados? Obrigado!

Publicado 07/04/2009 em 00:32
fonte usuário
Em outras línguas...                            


3 respostas

votos
1

1) Retire escolhas de models.CommaSeparatedIntegerField em modelos

2) Criar CommaSeparatedCharField como substituto

class CommaSeparatedCharField(forms.CharField):
    def to_python(self, value):
        if value in validators.EMPTY_VALUES:
            return u''
        csv = smart_unicode(','.join(value) )
        return csv   

class CommaSeparatedSelectMultiple(forms.SelectMultiple):
    def render(self, *args, **kwargs):
        print args, kwargs
        args_=list(args)
        if type(args_[1])!=list:
            args_[1] = args_[1].split(',')
        return super(CommaSeparatedSelectMultiple, self).render(*args_, **kwargs)

3) Aplique

class MyAdmin(admin.ModelAdmin):
    class form(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(forms.ModelForm, self).__init__(*args, **kwargs)
            for field_name, choices in [
                ('minutes', [(i,str(i)) for i in range(60)]),
            ]:
                self.fields[field_name] = CommaSeparatedCharField(
                    label=self.fields[field_name].label,
                    initial=self.fields[field_name].initial,
                    widget=forms.CommaSeparatedSelectMultiple(choices=choices)
                )

Bom trabalho em 1,2 tronco

Respondeu 20/04/2010 em 09:16
fonte usuário

votos
1

Eu não encontrar nenhuma resposta trabalhando para fazer models.CommaSeparatedIntegerField como forms.SelectMultiple. Então eu mudei models.CommaSeparatedIntegerField para models.ManyToManyField e campo de formulário torna-se obras muito bem! É mais adequado em casos, onde você precisa para fazer consultas neste campo.

Respondeu 28/04/2009 em 09:51
fonte usuário

votos
0

Eu uso o seguinte para o formulário de manipulação um pouco de cabelo, e ele funciona com 1,0. É detalhado, mas ele funciona.

class MyMovieAdminForm(forms.ModelForm):
    ## Meta, etc

    def __init__(self, *args, **kwargs):
        super(MyMovieAdminForm, self).__init__(*args, **kwargs)
        self.fields["genre"].widget = forms.SelectMultiple(choices=foo)
        self.fields["genre"].initial = self.instance.genre
        # Doesn't require redefining label, etc.
Respondeu 07/04/2009 em 14:42
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more