【问题标题】:Django admin change field from text to comboboxDjango 管理员将字段从文本更改为组合框
【发布时间】:2019-03-20 23:24:55
【问题描述】:

在我的模型中,我有这个类:

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) 不是显示为文本框,而是像一个带有预定义键/val 数据的组合框,如 1:'Descr1',2:Descr2'等等等等

如何在 django admin add and edit form 中实现这个结果?

提前致谢

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2010-11-21
      • 2014-11-26
      • 1970-01-01
      • 2016-02-10
      • 2018-09-20
      • 2012-05-30
      • 1970-01-01
      相关资源
      最近更新 更多