Django管理员将字段从文本更改为组合框

时间:2018-10-16 12:16:14

标签: django python-3.x django-models django-admin

在我的模型中,我有这个课程:

class temp_main(models.Model):
    descr = models.CharField(max_length=200, verbose_name="Description")
    notes = models.TextField(null=True, blank=True, verbose_name="Note")
    dt = models.DateTimeField(auto_now=True, verbose_name="Created")
    owner = models.ForeignKey('auth.User', related_name='tmain_owner', on_delete=models.CASCADE, verbose_name="API Owner")

class Meta:
    verbose_name = '1-Main Template'
    verbose_name_plural = '1-Main Templates'


def __str__(self):
    return self.descr

然后在我的admin.py

class temp_mainAdmin(admin.ModelAdmin):

    #list_filter = ('main_id__descr', 'l_type')
    list_display = ('descr', 'notes', 'dt')
    #ordering = ('-l_type',)

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super(temp_mainAdmin, self).save_model(request, obj, form, change)

    def changeform_view(self, request, obj_id, form_url, extra_context=None):

        l_mod = temp_main.objects.latest('id')

        extra_context = {
            'lmod': l_mod,
        }
        return super(temp_mainAdmin, self).changeform_view(request, obj_id, form_url, extra_context=extra_context)

全部完成,但是我将以添加和编辑的形式将字段descr(charfield)vas不会显示为文本框,而是像具有预定义键/值数据的组合框,如1:'Descr1',2:Descr2'等等

如何在django管理员添加和编辑表单中实现此结果?

预先感谢

1 个答案:

答案 0 :(得分:1)

您需要覆盖ModelAdmin.get_form()方法,这将允许您更改Django默认用于descr字段的输入字段的类型。它应该是这样的:

from django.forms import SelectMultiple

class temp_mainAdmin(admin.ModelAdmin):
    # No changes to the code you provided above / this is all the same:

    #list_filter = ('main_id__descr', 'l_type')
    list_display = ('descr', 'notes', 'dt')
    #ordering = ('-l_type',)

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super(temp_mainAdmin, self).save_model(request, obj, form, change)

    def changeform_view(self, request, obj_id, form_url, extra_context=None):

        l_mod = temp_main.objects.latest('id')

        extra_context = {
            'lmod': l_mod,
        }
        return super(temp_mainAdmin, self).changeform_view(request, obj_id, form_url, extra_context=extra_context)

    # This is new - override the parent class's get_form method:
    def get_form(self, request, obj=None, **kwargs):
        # 1. Get the form from the parent class:
        form = super(temp_mainAdmin, self).get_form(request, obj, **kwargs)
        # 2. Change the widget:
        form.base_fields['descr'].widget = SelectMultiple(choices=(
            (1, 'Descr1'),
            (2, 'Descr2'),
        ))
        # 3. Return the form!
        return form