Я хочу реализовать настройку в моей панели администратора 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? Как я могу это сделать? Спасибо.

Изменить : для лучшего понимания (как предлагается в комментарии) я хочу реализовать главный переключатель на панели администратора, который включает / выключает все описания для каждого экземпляра, показываемого пользователю.

1
PercySherlock 15 Ноя 2021 в 18:07
1
Это кажется немного непонятным. Вы хотите переключить, будет ли поле отображаться в админке Django, как сворачивающийся элемент, или вам нужно дополнительное поле в модели, которое определяет, может ли пользователь видеть описание этого экземпляра в вашем шаблоне HTML, или вы хотите главный переключатель, который отключает все описания для каждого экземпляра, показываемого пользователю?
 – 
Jacinator
15 Ноя 2021 в 21:36
Мне это тоже непонятно. Если вы хотите скрыть / показать на панели управления при посещении этой панели, возможно, вам следует использовать JavaScript для переключения HTML и сохранить это начало в файлах cookie. Если вы хотите использовать панель управления, чтобы скрыть ее, когда другие пользователи посещают страницы, тогда может потребоваться другая таблица для настроек, и ей нужно будет использовать эти настройки при отображении HTML для других пользователей.
 – 
furas
15 Ноя 2021 в 22:02
Последняя часть вашего комментария - это именно то, чего я хочу достичь. Главный переключатель на панели управления администратора, который включает / выключает все описания для каждого экземпляра, показываемого пользователю.
 – 
PercySherlock
15 Ноя 2021 в 22:06

3 ответа

Лучший ответ

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

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

is_description = models.BooleanField(default=True)

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

python manage.py makemigrations
python manage.py migrate

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

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

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

2
Toluwalemi 18 Ноя 2021 в 17:53

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

0
Jacinator 16 Ноя 2021 в 00:38

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

1 разрешение для пользователя с правами администратора. 2 bool показывать или не возражать. 3 Новый вид администратора.

1

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

В admin.py в

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

Создайте новое представление администратора 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),
0
Ohad the Lad 16 Ноя 2021 в 12:08
Спасибо, но на интерфейс это не влияет. Данные все еще отражаются во внешнем интерфейсе. Как сделать так, чтобы изменения в админке также отражались в шаблоне без необходимости редактировать шаблон или представления?
 – 
PercySherlock
17 Ноя 2021 в 07:57
JS - но его может взломать админ ...
 – 
Ohad the Lad
17 Ноя 2021 в 15:40