como modificar opções nas páginas de admin - django

votos
9

Eu tenho um modelo que tem um campo chamado estado:

class Foo(models.Model):
    ...
    state = models.IntegerField(choices = STATES)
    ...

Para cada estado, possíveis escolhas são um determinado subconjunto de todos os estados. Por exemplo:

if foo.state == STATES.OPEN:     #if foo is open, possible states are CLOSED, CANCELED
    ...
if foo.state == STATES.PENDING:  #if foo is pending, possible states are OPEN,CANCELED
    ...

Como resultado, quando as mudanças foo.state para um novo estado, o seu conjunto de escolhas possíveis muda também.

Como posso implementar essa funcionalidade em Admin Pages Adicionar / Alterar?

Publicado 14/05/2009 em 17:42
fonte usuário
Em outras línguas...                            


4 respostas

votos
12

Quando você cria uma nova interface de administração para um modelo (por exemplo MyModelAdmin) existem métodos específicos para substituir as opções padrão de um campo. Para um genérico campo de escolha :

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_choice_field(self, db_field, request, **kwargs):
        if db_field.name == "status":
            kwargs['choices'] = (
                ('accepted', 'Accepted'),
                ('denied', 'Denied'),
            )
            if request.user.is_superuser:
                kwargs['choices'] += (('ready', 'Ready for deployment'),)
        return super(MyModelAdmin, self).formfield_for_choice_field(db_field, request, **kwargs)

Mas você também pode substituir escolhas para ForeignKey e muitos para muitos relacionamentos.

Respondeu 03/05/2013 em 22:09
fonte usuário

votos
9

Você precisa usar um ModelForm costume na classe ModelAdmin para esse modelo. No método __init__ o costume de ModelForm, você pode definir dinamicamente as escolhas para esse campo:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        current_state = self.instance.state
        ...construct available_choices based on current state...
        self.fields['state'].choices = available_choices

Você poderia usá-lo como este:

class FooAdmin(admin.ModelAdmin):
    form = FooForm
Respondeu 14/05/2009 em 22:35
fonte usuário

votos
0

Isto parece como um trabalho para alguns javascript. Você quer que a lista de itens em uma caixa de seleção para mudar, dependendo do valor de uma outra coisa, que é presumivelmente um botão de opção ou rádio. A única maneira de fazer isso acontecer dinamicamente - sem obter o usuário para salvar o formulário e recarregar a página - seria com javascript.

Você pode carregar javascript personalizado na página de administração de um modelo usando classe de mídia do ModelAdmin, documentado aqui .

Respondeu 14/05/2009 em 22:40
fonte usuário

votos
-1

Eu vejo o que você está tentando fazer, mas porque não basta exibir todos eles e se a pessoa escolhe o (já) estado atual, apenas não mudar alguma coisa?

Você também pode apenas construir uma visão com um formulário para fornecer essa funcionalidade

Respondeu 14/05/2009 em 18:32
fonte usuário

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