django_admin_log может контролироваться через администратора Django?

JSF 2.3 +

Для этого вы можете использовать @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.2 -

Если вы еще не находитесь в JSF 2.3, вам нужно перейти в сторонние библиотеки JSF.

Отмечено, что является основой для 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 на сервер и обновлять контент, когда это необходимо.

См. Также:

5
задан Thierry Lam 10 February 2010 в 21:46
поделиться

2 ответа

Разве вы не можете просто:

from django.contrib.admin.models import LogEntry
admin.site.register(LogEntry)

В одном из ваших файлов admin.py? Я только что протестировал его, он баребонный, но работает.

Вы можете быть более конкретными и создать класс ModelAdmin для LogEntry, чтобы обеспечить лучший просмотр списка и, возможно, некоторые возможности фильтрации. Но это должно сработать.

9
ответ дан 18 December 2019 в 07:29
поделиться

Немного точек на основе моего опыта:

  • хорошо сделать все поля только для чтения. Одна причина состоит, очевидно в том, потому что это - журналы и не должно быть изменяемым, но другой - производительность. Если Вы позволяете изменять пользователей, например, загружение страницы изменения на своем собственном может быть проблемой, если у Вас есть сотни тысяч пользователей как в моем случае. Иначе можно использовать 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
    
0
ответ дан 18 December 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: