Есть ли способ включить/выключить определенное поле из админки Django?

Я хочу реализовать настройку в моей панели администратора Django, где я могу отключить/включить определенное поле. Если я отключу поле, то данные в этом поле не будут отображаться на веб-странице. Если я включу это поле, то данные будут отображаться на веб-странице. Я хочу сделать это только из моей панели администратора.

Это мой models.py:

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    name = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=100, unique=True)
    image = models.ImageField(upload_to='products/')
    description = models.TextField()
    quantity = models.CharField(max_length=10)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)

Это admin.py:

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'category', 'slug', 'price', 'available')
    list_filter = ('category', 'available')
    list_editable = ('price', 'available')
    prepopulated_fields = {'slug': ('name',)}

Я хочу иметь возможность включать/выключать (возможно, как кнопку переключения) поле description из моей панели администратора. Есть ли способ реализовать это в моем файле admin.py? Как я могу это сделать? Спасибо.

Константа Django constance (без связи с собой) может сделать то, что вы хотите. Он не обязательно сохранит описанный вами тумблер каким-либо образом связанным с вашей моделью, но он позволит вам иметь редактируемые настройки. Это может быть использовано в определении формы или передано в контекст через представление или процессор контекста.

Несколько способов сделать это.

1 разрешение пользователю admin. 2 bool показывать или не показывать Объект. 3 Новое представление администратора.

1

Вы можете добавить разрешение на просмотр этого поля и создать метод в admin.py для просмотра этого поля или вернуть None в зависимости от значения разрешения.

В файле admin.py in

class YourAdminClass(admin.ModelAdmin)
    def get_queryset(self, request):
         queryset= super(YourAdminClass, self).get_queryset(request)
         self.request = request
         return queryset 

    def mobile_phone(self, obj):
        return obj.user.mobile_phone if self.request.user.has_special_permission else None

2

Вы можете добавить bool к объекту вместо разрешения пользователю (показывать или не показывать в админке) и изменить набор запросов как в варианте 1 (так вы сможете управлять им с клиентской стороны FE)

def get_queryset(self, request):
    qs = super(YourAdminClass, self).get_queryset(request)
    return qs.filter(SHOW_MY_FIELD=True)

3

Создайте новое представление Admin NoFieldAdmin и альтернативу Admin и показывайте или не показывайте ссылку в главной админке через url админа в основном файле admin.py

class NoFieldAdminSite(AdminSite):
    pass
    #or overwrite some methods for different functionality

NoFieldAdmin= NoFieldAdminSite(name="nofield_admin")   

in urls.py
        urlpatterns = [
            url(r'^admin/', admin.site.urls),
            url(r'^NOFIELD-admin/', NoFieldAdmin.urls),

Вот что вы можете сделать:

Сначала добавьте это поле в свой models.py:

is_description = models.BooleanField(default=True)

Затем выполните миграции:

python manage.py makemigrations
python manage.py migrate

Тогда вы можете добавить следующую настройку к вашему admin.py:

  • переопределите метод get_urls и добавьте методы enable_description и disable_discription на модель admin. Они будут служить в качестве двух методов представления:

      def get_urls(self):
          urls = super().get_urls()
          my_urls = [ 
              path('descriptionon/', self.enable_description),
              path('descriptionoff/',self.disable_discription),
          ]
          return my_urls + URLs 
    
      def enable_description(self, request):
          self.model.objects.all().update(is_description=True)
          self.message_user(request, "All descriptions are now turned on")
          return HttpResponseRedirect("../") 
    
      def disable_description(self, request):
          self.model.objects.all().update(is_description=False)
          self.message_user(request, "All descriptions are now turned on")
          return HttpResponseRedirect("../")
    

Далее, вам нужно переопределить ваш шаблон администратора Django, создав файл шаблона product_changelist.html и затем расширить admin/change_list.html:

{% extends 'admin/change_list.html' %}

{% block object-tools %}
    <div>
        <form action="descriptionoff/" method="POST">
            {% csrf_token %}
                <button type="submit">Turn description on</button>
        </form>
        <form action="descriptionoff/" method="POST">
            {% csrf_token %}
                <button type="submit">Turn description off</button>
        </form>
    </div>
    <br />
    {{ block.super }}
{% endblock %}

Зайдите в панель администратора для вашей модели Product. Теперь вы должны увидеть две кнопки над строкой поиска.

Наконец, в вашем views.py добавьте эту логику:

def product_list(request):
    products = Product.objects.all()
    for product in products.iterator():    
    if product.is_description:
        return render(request,
                      'product_list.html',
                      {'product': products})
    disable_descp = product.__class__.objects.all().values('category', 'name', 'image',...)

    return render(request,
                  'product_list.html',
                  {'product': disable_descp})

Когда вы нажмете на Turn description on в вашей панели администратора и обновите страницу шаблона, описания будут доступны. Оно не будет доступно, если вы нажмете на Turn description off в вашей панели администратора.

Вернуться на верх