No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Mejorando el Admin: Change List

12/17
Recursos

Aportes 9

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Para cambiar el diseño de la casilla de booleanos pueden añadir el decorador @admin.display() a en su modelo de Question:

from django.contrib import admin

class Question(models.Model):
    # ...
    @admin.display(
        boolean=True,
        ordering='pub_date',
        description='Published recently?',
    )
    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

Fuente

También la class ChoiceInLine puede instanciarla con
(admin.TabularInline)
Y se tendrá un diseño diferente para agregrar las choices al CREAR una question

Para mi es más práctico 😉

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

Mi aporte es a un posible error que les pase, en caso de que les aparezca este error :

can’t compare datetime.datetime to datetime.date

solo deben de ir al archivo de models y a la función was_published_recently en los timezone.now() hay que agregarles .date() es decir quedarían de la siguiente forma.

def was_published_recently(self):
        return timezone.now().date() >= self.pub_date >= timezone.now().date() - datetime.timedelta(days=1)

Pueden utilizar el ModelAdmin.exclude para quitar datos que no quieran agregar en los formularios como en nuestro caso la casilla votes en choices, es algo que no debería poder modificarse.

class ChoicesInline(admin.TabularInline):
    model = Choice
    formset= AtLeastOneRequiredInlineFormSet
    extra = 1
    exclude= ['votes']

Código de la clase:

# polls/admin.py
from django.contrib import admin
from .models import Question, Choice

#Creando un TabularInLine desde el modelo de Choice
class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

#Creando un ModelAdmin desde el modelo de Question
class QuestionAdmin(admin.ModelAdmin):
    # Que ver en la vista de Questions
    list_display = ('question_text', 'pub_date', 'was_published_recently')
    # Que filtrar en la vista de Questions
    list_filter = ['pub_date']
    # Tipo de busqueda
    search_fields=['question_text']
    #Agrupar los fields en sectores
    fieldsets = [
        (None,               {'fields': ['question_text']}),
        #Date information se agrega un collapse
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    #Agregando la clase creada
    inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

Tambiend podemos modificar la sección “Acción” que por default solo da la opcion para eliminar alguna pregunta.

En mi caso yo le agregue al modelo Question un atributo que verifica el estado actual de la pregunta(Ok, Upkeep)
Este seria mi código, donde también hago uso de los metodos When, Case, Value.

from django.contrib import admin, messages
from .models import Question, Option
from django.db.models import When, Value, Case


class OptionInLine(admin.TabularInline):
    model = Option
    extra = 1
    exclude = ["counter"]

################################################
# Dentro de:
# class QuestionAdmin(admin.ModelAdmin):

    def invert_status(ModelAdmin, request, queryset):
        """
        Allows to Invert the actual Question Status
        E.g:
            if status is Ok, this will change it to Upkeep
        """
        queryset.update(
            status=Case(
                When(status=1, then=Value(0)),
                When(status=0, then=Value(1)),
                default=Value(0))
        )
        messages.success(request,
                         "Selected Redord(s) Status is Upkeep now")

    def status_to_ok(ModelAdmin, request, queryset):
        """Selected Question's Status will be changed to Ok"""
        queryset.update(status=1)
        messages.success(request,
                         "Selected Redord(s) Status is Ok now")

    def status_to_upkeep(ModelAdmin, request, queryset):
        """Selected Question's Status will be changed to Upkeep"""
        queryset.update(status=0)
        messages.success(request,
                         "Selected Redord(s) Status is Upkeep now")

    admin.site.add_action(invert_status, "Invert Current Status")
    admin.site.add_action(status_to_upkeep, "Change Status to Upkeep")
    admin.site.add_action(status_to_ok, "Change Status to Ok")


admin.site.register(Question, QuestionAdmin)


me encataria ver un curso solo de api rest con django

Literalmente soy yo

También se pueden agregar filtros, campos de búsqueda y columnas adicionales para facilitar la navegación entre los datos:
En el archivo admin.py de polls

class QuestionAdmin(admin.ModelAdmin):
    fields = ["pub_date", "question_text"]
    inlines = [ChoiceInLine]
    # columnas adicionales
    list_display = ("question_text", "pub_date", "was_published_recently") 
    list_filter = ["pub_date"]  # filtros
    search_fields = ["question_text"]   # campos de busqueda

Todos mis apuntes en mi github