Я хочу реализовать настройку в моей панели администратора 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
? Как я могу это сделать? Спасибо.
Изменить : для лучшего понимания (как предлагается в комментарии) я хочу реализовать главный переключатель на панели администратора, который включает / выключает все описания для каждого экземпляра, показываемого пользователю.
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
на панели администратора.
Константа Django (не связанная со мной) может делать то, что вы хотите. Он не обязательно хранит описываемый вами переключатель, каким-либо образом связанный с вашей моделью, но он позволит вам иметь редактируемые настройки. Это можно использовать в определении формы или передать в контекст через представление или обработчик контекста.
Есть несколько способов сделать это.
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),
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.