Есть ли способ включить/выключить определенное поле из админки 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
в вашей панели администратора.