Администратор Django меняет поле с текста на комбинированный список - PullRequest
0 голосов
/ 16 октября 2018

В моих моделях у меня есть этот класс:

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) не отображается как текстовое поле, а вместо этого как комбинированный список с предварительно определенными данными key / val, такими как 1: 'Descr1', 2: Descr2 'и т. д.и редактировать форму?

заранее спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Вам необходимо переопределить метод 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
...