Как изменить отображение администратора Django при использовании ManyToManyField - PullRequest
0 голосов
/ 04 мая 2018

Я кодирую новостной сайт. У новостной модели есть внешний ключ ManyToManyField с именем tag .

Вот моя новость, модель:

class News(models.Model):
   title = models.CharField(max_length=100, verbose_name='title') 
   category = models.ForeignKey(Category, on_delete=models.CASCADE, 
   related_name="cate", blank=True, verbose_name='Category')
   tag = models.ManyToManyField(Tag, blank=True, verbose_name='Tags')

    class Meta:
        verbose_name = "新闻"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title

Вот моя модель тега:

class Tag(models.Model):
    name = models.CharField(max_length=40)

    class Meta:
        verbose_name = "Tag"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

Теперь я обнаружил, что проблема в том, что в админке окно меню тегов слишком маленькое, как на снимке экрана: enter image description here

Однако в практических проектах, например, на новостном веб-сайте с большим трафиком, будут десятки тегов или, может быть, около 100 тегов, действительно сложно и сложно выбрать тег среди такого количества тегов в таком маленьком окне меню.

Вот мой admin.py:

class TagAdmin(object):
    list_display = ['name']
    search_fields = ['name']
    list_filter = ['name']

xadmin.site.register(Tag, TagAdmin)

Так какая-нибудь хорошая идея может облегчить? Кстати, я использую Xadmin. Я думаю, может быть, я должен изменить CSS этого места.

Любой друг может помочь? Спасибо большое!

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Очень ценю все ответы.

И я нашел лучший и самый простой способ ее решить!

Первый : если вы используете admin, вам просто нужно добавить в admin.py:

filter_horizontal = ('tags', )

. Если вы используете Xadmin, просто наберите:

style_fields = {'tag': 'm2m_transfer'}

конкретный пример:

class NewsAdmin(object):
    list_display     = ['title',]
    search_fields    = ['title', ]
    list_filter      = ['title', ]
    style_fields     = {'tag': 'm2m_transfer'}
0 голосов
/ 04 мая 2018

Переопределите django admin css и укажите его в этом файле

from your_app.models import News

@admin.register(News)
class NewsAdmin(admin.ModelAdmin):
    filter_horizontal = ('tag',)

    class Media:
        css = {
            'all': ('your_file.css',), # file located in your static direcotry
        }

Вот некоторые class, которые вы можете переопределить:

.selector-available,
.selector-chosen {
    width: 100px;
}

.selector .selector-available input {
    width: 200px;
}

.selector select {
    width: 300px;
}

.selector {
    width: 400px;
}
...