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鈥檛 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 鈥淎cci贸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