Django管理员选择字段

Rud*_*lah 12 django django-admin

我有一个具有CharField的模型,在管理员中我想为窗口小部件添加选项.这样做的原因是我使用的是代理模型,并且有许多模型共享这个CharField,但它们各有不同的选择.

class MyModel(MyBaseModel):
    stuff = models.CharField('Stuff', max_length=255, default=None)

    class Meta:
        proxy = True

class MyModelAdmin(admin.ModelAdmin):
    fields = ('stuff',)
    list_display = ('stuff',)
admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)

对于这种模式,我想用MY_CHOICESMyModelAdmin.

我是否覆盖小部件?我需要覆盖整个表单吗?

dem*_*mux 19

from django.contrib import admin
from django import forms

class MyModel(MyBaseModel):
    stuff = models.CharField('Stuff', max_length=255, default=None)

    class Meta:
        proxy = True

class MyModelForm(forms.ModelForm):
    MY_CHOICES = (
        ('A', 'Choice A'),
        ('B', 'Choice B'),
    )

    stuff = forms.ChoiceField(choices=MY_CHOICES)

class MyModelAdmin(admin.ModelAdmin):
    fields = ('stuff',)
    list_display = ('stuff',)
    form = MyModelForm

admin.site.register(MyModel, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)

请参阅:https://docs.djangoproject.com/en/dev/ref/forms/fields/#choicefield


dai*_*no3 7

您不需要自定义表单。

这是您需要的最低限度:

# models.py
from __future__ import unicode_literals

from django.db import models

class Photo(models.Model):
    CHOICES = (
        ('hero', 'Hero'),
        ('story', 'Our Story'),
    )

    name = models.CharField(max_length=250, null=False, choices=CHOICES)

# admin.py
from django.contrib import admin
from .models import Photo


class PhotoAdmin(admin.ModelAdmin):
    list_display = ('name',)


admin.site.register(Photo, PhotoAdmin)
Run Code Online (Sandbox Code Playgroud)


Ger*_*ard 5

您需要覆盖ModelAdmin将要使用的表单:

class MyForm(forms.ModelForm):
    stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None)

    class Meta:
        model = MyModel
        fields = ('stuff', 'other_field', 'another_field')


class MyModelAdmin(admin.ModelAdmin):
    fields = ('stuff',)
    list_display = ('stuff',)
    form = MyForm
Run Code Online (Sandbox Code Playgroud)

如果你需要你的选择是动态的,也许你可以做类似的事情:

class MyForm(forms.ModelForm):
    stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None)

    def __init__(self, stuff_choices=(), *args, **kwargs):
        # receive a tupple/list for custom choices
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['stuff'].choices = stuff_choices
Run Code Online (Sandbox Code Playgroud)

并在您的ModelAdmin' s 中__init__定义将是什么MY_CHOICES并在那里分配表单实例:

祝你好运!:)


小智 5

您可以通过formfield_for_choice_field()这种方式覆盖而无需创建新表单。

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().formfield_for_choice_field(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

请参阅formfield_for_choice_field