简体   繁体   中英

search models in django admin

There is a model of orders, where new orders with information fall, photo1

1

Part of the information is the model of sneakers, sometimes these sneakers need to be corrected, now this is done in the form of TabularInline, photo2 and photo3, there are a lot of sneakers and it takes a very long time to scroll through this drop-down list, is there a way to make a search by entering text, like search_fields?

admin.py

class SuitItemInOderInline(admin.TabularInline):
    model = SuitInOder
    extra = 0

class SuitOrderAdmin(admin.ModelAdmin):
    inlines = [SuitItemInOderInline]
    list_display = ('inst', 'created')
    list_filter = ('status',)


class Meta:
    model = OrderSuit
    

admin.site.register(OrderSuit, SuitOrderAdmin)

models.py

class SuitInOder(models.Model):
    order = models.ForeignKey(OrderSuit, on_delete=models.CASCADE, verbose_name='Заказ', related_name='ordered_item')
    item = models.ForeignKey(SuitItem, on_delete=models.CASCADE, verbose_name='Костюм', related_name='spb_item')

    def __str__(self):
        return f'{self.order} | {self.item.model.id} --- {self.item}'

    def save(self, *args, **kwargs):
        not_available = ['new', 'in_progress', 'completed']
        if self.order.status in not_available:
            self.item.in_stock = False
        else:
            self.item.in_stock = True
        self.item.save(force_update=True)
        super(SuitInOder, self).save(*args, **kwargs)

    def delete(self):
        self.item.in_stock = True
        self.item.save(force_update=True)
        super(SuitInOder, self).delete()

    class Meta:
        verbose_name = 'Костюм в заказе'
        verbose_name_plural = 'Костюмы в заказе'

class OrderSuit(models.Model):
    NEW = 'new'
    IN_PROGRESS = 'in_progress'
    COMPLETED = 'completed'
    CANCELED = 'canceled'

    choises = (
        (NEW, 'Новый'),
        (IN_PROGRESS, 'В работе'),
        (COMPLETED, 'Выполнен'),
        (CANCELED, 'Отменен')
    )

    name = models.CharField(max_length=32, verbose_name='Имя', blank=True)
    phone_number = models.CharField(max_length=13, verbose_name='Номер телефона')
    inst = models.CharField(max_length=64)
    address = models.CharField(max_length=64, verbose_name='Адресс')
    deliver_time = models.CharField(max_length=64, null=True, verbose_name='Время доставки')
    comment = models.TextField(verbose_name='Комментарий')
    status = models.CharField(max_length=32, choices=choises, null=True, verbose_name='Статус заказа')
    created = models.DateTimeField(verbose_name='Время заказа', editable=False, default=datetime.now()+timedelta(hours=3))


    def __str__(self):
        return f'{self.name}'

    def save(self, *args, **kwargs):
        self.created = datetime.now() +timedelta(hours=3) 
        if self.id:
            items = self.ordered_item.all()
            for item in items:
                item.save()

        super(OrderSuit, self).save(*args, **kwargs)

    class Meta:
        verbose_name = 'Заказ костюма'
        verbose_name_plural = 'Заказы костюмов'

2

3

If these are foreignKey fields, use raw_id_fields so you can search them in another window and it will make the load faster.

Photo1 need to use autocomplete_fields and register a new model for example SuitSearch, which has a search_fields which refers to model__name

admin.py

class SuitSearch(admin.ModelAdmin):
   search_fields = ('model__name',)
    
   class Meta:
       model = SuitItem

admin.site.register(SuitItem, SuitSearch)        


class SuitItemInOderInline(admin.TabularInline):
    model = SuitInOder
    autocomplete_fields = ('item',)
    extra = 0

class SuitOrderAdmin(admin.ModelAdmin):
    inlines = [SuitItemInOderInline]
    list_display = ('inst', 'created')
    list_filter = ('status',)


    class Meta:
        model = OrderSuit
        

admin.site.register(OrderSuit, SuitOrderAdmin)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM