Для этого вы можете использовать @Push
и
. Ниже приведен пример запуска, который обновляет таблицу данных при событии, запущенном бэкэндом.
#{notification.message}
@Named @ApplicationScoped
public class Bean {
private List notifications;
@Inject
private NotificationService service;
@Inject @Push
private PushContext push;
@PostConstruct
public void load() {
notifications = service.list();
}
public void onNewNotification(@Observes Notification newNotification) {
notifications.add(0, newNotification);
push.send("updateNotifications");
}
public List getNotifications() {
return notifications;
}
}
@Stateless
public class NotificationService {
@Inject
private EntityManager entityManager;
@Inject
private BeanManager beanManager;
public void create(String message) {
Notification newNotification = new Notification();
newNotification.setMessage(message);
entityManager.persist(newNotification);
beanManager.fireEvent(newNotification);
}
public List list() {
return entityManager
.createNamedQuery("Notification.list", Notification.class)
.getResultList();
}
}
Если вы еще не находитесь в JSF 2.3, вам нужно перейти в сторонние библиотеки JSF.
(JSR356 WebSocket + CDI)
(Атмосфера) Отмечено, что
является основой для JSF 2.3
]. Итак, если вы нашли много общего, то это правильно.
PrimeFaces использует Атмосфера под капюшонами (что неудобно для настройки без Maven). Атмосфера поддерживает websockets с возвратом SSE и длительным опросом. ICEfaces основан на древней методике длинного опроса . Все они не реализуют собственный API-интерфейс JSR356 WebSocket, который был позже представлен в Java EE 7.
OmniFaces использует собственный API-интерфейс JSR356 WebSocket (поддерживается на всех серверах Java EE 7 и Tomcat 7.0.27+). Поэтому он также очень прост в настройке и использовании (один JAR, один параметр контекста, один тег и одна аннотация). Для этого требуется только CDI (не сложно установить на Tomcat ), но он позволяет вам даже нажать от артефакта не-JSF (например, @WebServlet
). В целях безопасности и безопасности JSF, он поддерживает только односторонний push (от сервера к клиенту), а не наоборот. Для этого вы можете использовать JSF ajax обычным способом. JSF 2.3
в значительной степени основан на OmniFaces
, поэтому вы найдете много сходства в своих API-интерфейсах ( JSF - OmniFaces ).
Кроме того, вы можете использовать опрос вместо нажатия. Практически каждая библиотека компонентов JSF, поддерживающая ajax, имеет компонент
, такой как PrimeFaces с
. Это позволяет отправлять exery X секунд запрос ajax на сервер и обновлять контент, когда это необходимо.
Разве вы не можете просто:
from django.contrib.admin.models import LogEntry
admin.site.register(LogEntry)
В одном из ваших файлов admin.py? Я только что протестировал его, он баребонный, но работает.
Вы можете быть более конкретными и создать класс ModelAdmin
для LogEntry, чтобы обеспечить лучший просмотр списка и, возможно, некоторые возможности фильтрации. Но это должно сработать.
Немного точек на основе моего опыта:
raw_id_fields
. я также создал фильтр для действия, поскольку orignal модель не имеет CHOICES
поле и использующий всего action_flag
, поскольку фильтр покажет 1,2,3 выбором, который не очень удобен для пользователя:
class ActionFlagFilter(admin.SimpleListFilter):
title = 'Action flag filter'
parameter_name = 'action_flag'
def lookups(self, request, model_admin):
return (
(ADDITION, "Add"),
(CHANGE, "Change"),
(DELETION, "Delete"),
)
def queryset(self, request, queryset):
if self.value():
return queryset.filter(action_flag=self.value())
return queryset