es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El queryset en admin.py nunca se ejecuta en Django 2.2.

Mi código fue originalmente implementado para Django 1.8, pero ahora (después de los cambios necesarios) lo estoy ejecutando con Django 2.2. Parece que lo siguiente estaba planeado para mostrar solo al usuario no superusuario sus propios archivos:

class Tiedostot3Admin(admin.ModelAdmin):
    fields = ['otsikko', 'kuvaus', 'tiedosto']
    list_display = ('otsikko','paivitetty')
    inlines = [
      Liitet3Inline,
  ]
    def queryset(self, request):
        print("consulta, usuario de la solicitud", request.user)
        qs = super(Tiedostot3Admin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(owner=request.user)

    def save_model(self, request, obj, form, change):
        print("guardar modelo, usuario de la solicitud", request.user)
        obj.owner = request.user
        obj.save()

Cuando guardo nuevos archivos puedo ver que se ejecuta save_model(), pero no sé cómo hacer que se ejecute consulta(). Parece que siempre muestra la misma lista para todos los usuarios.

models.py:

class Tiedostot3(models.Model):
    otsikko = models.CharField(max_length=250)
    kuvaus = RichTextField(blank=True)
    paivitetty = models.DateTimeField(auto_now_add=True, verbose_name="Päivitetty")
    tiedosto = models.FileField(upload_to='poytakirjat', verbose_name=&#quot;Tiedosto", blank = True)
    owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ['-paivitetty']
        verbose_name = "tiedosto"
        verbose_name_plural="tiedostot"

    def __unicode__(self):
        return unicode(self.otsikko)

class Liite3(models.Model):
    otsikko = models.CharField(max_length=250)
    tiedosto = models.FileField(upload_to='poytakirjat')
    doku = models.ForeignKey(Tiedostot3, related_name="liitteet", on_delete=models.CASCADE)

    class Meta:
        verbose_name_plural="Liitteet"

    def __unicode__(self):
        return unicode(self.otsikko)

la página: enter image description here

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el método queryset() en la clase Tiedostot3Admin no se está ejecutando porque no está siendo reemplazado correctamente. En Django 2.2, la forma recomendada de reemplazar el queryset en el administrador es mediante el uso de get_queryset() en lugar de queryset().

    Por lo tanto, cambie el método queryset() por el método get_queryset() en la clase Tiedostot3Admin y el método debería ejecutarse:

    class Tiedostot3Admin(admin.ModelAdmin):
        fields = ['otsikko', 'kuvaus', 'tiedosto']
        list_display = ('otsikko', 'paivitetty')
        inlines = [Liitet3Inline,]
    
        def get_queryset(self, request):
            print("get_queryset, request.user", request.user)
            qs = super().get_queryset(request)
            if request.user.is_superuser:
                return qs
            return qs.filter(owner=request.user)
    
        def save_model(self, request, obj, form, change):
            print("save_model, request.user", request.user)
            obj.owner = request.user
            obj.save()
    

    Además, tenga en cuenta que super() no necesita pasar la clase y el argumento on_delete es necesario en el campo ForeignKey.

Comments are closed.