class View and get parameter

Hi, my name luigi from italy my english school … i’am study django from blog etc…

My problem from class View change data primary from primary=False to primary=True

My code:

class set_primary(View):
    def get(self, request, *args, **kwargs):
        avatar = Avatar.objects.filter(id=User).update(primary=True)
        return avatar       

My path

    path('set_avatar/<pk>/', set_primary.as_view(), name='AvatarSetPrimary'),

How to fix problem?.

Interesseting all cicle change data primary=False, also current id and user set primary=True

how to implemented ?

Thanks.
sorry my english buffo.

Please post your Avatar model here.

Also, if you are getting an error, please post the error and the complete traceback from your server console. (Not what you see in the browser.)

Error:

TypeError: Field 'id' expected a number but got <class 'accounts.models.User'>.

My model:

from django.db import models
from django.utils.translation import gettext_lazy as _
from django.db import models
from stdimage import StdImageField
from django.contrib.auth import get_user_model
from core.choices import Status
from core.utils import PathAndRename, resize_and_autorotate

class Avatar(models.Model):
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name='avatar')
    avatar  = StdImageField(_('Photo'), upload_to=PathAndRename("avatar/"), render_variations=resize_and_autorotate, blank=True , variations={'profile': (160, 120),})
    primary = models.BooleanField(_('Use primary'), default=False, blank=True, null=True)
    status  = models.CharField(max_length=2, choices=Status.choices, default=Status.DRAFT)    
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    
    class Meta:
        verbose_name = _("Avatar")

my digit url:

http://localhost:8080/avatar/set_avatar/3/)

The error is here:

I’m not sure which Avatar instances you’re trying to filter here, but the id field requires the right data type. (If your id field in an integer field, then you need to be using an integer value.)

ok, how to fixed problem ? you solution ?

My change value field from false to true from user.

Any ideas write solution ?

writing normal functions view:

def set_primary(request, id):
    avatar = Avatar.objects.get(id=id)
    return Avatar.objects.filter(pk=avatar).update(primary=True)

my problem:

TypeError: set_primary() got an unexpected keyword argument 'pk'

You have defined your url as:

But your view is defined as:

class SetPrimary(View):
    def get(self, request, **kwargs):
        unit = Avatar.objects.get(id=kwargs["id"])
        return HttpResponse(Avatar.objects.filter(id=unit.id).update(primary=True))

Come faccio fare per fare un ciclo che metto tutte a false e metto quella scelta a true?.

Google translate da “ITALIAN” a “ENGLISH”.

Grazie mille.

— From google translate —

Innanzitutto, queste query sono ridondanti:

Puoi eliminare la prima query e modificare la seconda query in:
Avatar.objects.filter(id=kwargs["id"]).update(primary=True))

Tale query, indipendentemente dal fatto che utilizzi la prima o la seconda versione, individuerà solo un’istanza di “Avatar”.

In nessuno dei due casi stai aggiornando più istanze di quel modello.

Quindi non sono sicuro di cosa intendi con “imposta tutto su false”, perché ti riferisci solo a un oggetto.

— The original English —

First, these queries are redundant:

`unit = Avatar.objects.get(id=kwargs["id"])`
`Avatar.objects.filter(id=unit.id).update(primary=True))`

You can get rid of that first query, and change the second query to:
Avatar.objects.filter(id=kwargs["id"]).update(primary=True))

That query, regardless of whether you use the first or second version, is only going to locate one instance of Avatar.

In neither case are you updating multiple instances of that model.

So I’m not sure what you mean by “sets all to false”, because you’re only referencing one object.

ok, cosi funziona. ma vorrei sapere come fare che uno non imbroglia … ma imposta il suo avatar personale ma non di altri…

penso con self.request.user.id ma dove protei metterlo ?
grazie mille se scrivo in italiano.

buona settimana.

— From translate.google.com
Un individuo può avere più istanze Avatar associate al proprio oggetto User. Quello che ho capito da quello che hai scritto è che stai cercando di impostare “primary = False” per tutte le istanze di Avatar correlate a quell’ User eccetto per l’istanza passata come parametro id dell’ URL, che vuoi impostare come True.

Nella richiesta, hai accesso all’oggetto User come request.user.

Ciò significa che il gruppo di istanze di Avatar relative a quell’ User sarebbe:
avatars = Avatar.objects.filter(user=request.user)
l’istanza Avatar selezionata sarebbe:
selected = avatars.get(id=id)
le istanze di Avatar non selezionate sarebbero:
not_selected = avatars.exclude(id=id)

— the original English —
An individual may have multiple Avatar instances associated with their User object. My understanding from what you’ve written is that you are looking to set primary = False for all instances of Avatar related to that User except for the instance being passed in as the id parameter of the url, which you want to set as True.

In the request, you have access to the User object as request.user.

This means that the group of Avatar instances related to that User would be:
avatars = Avatar.objects.filter(user=request.user)
the selected Avatar instance would be:
selected = avatars.get(id=id)
the non-selected Avatar instances would be:
not_selected = avatars.exclude(id=id)

Ho scritto cosi:

class SetPrimary(View):
    def get(self, request, **kwargs):
        user = User.objects.get(id=self.request.user.id)
        return HttpResponse(Avatar.objects.filter(user=user, id=kwargs["id"]).update(primary=True))

Ma un ciclo for per intercettare la true e mettere false le altre … quando l’utente vuole cambiare l’avatar.

grazie mille e buona sera.

— from translate.google.com

Ancora una volta, questo è totalmente inutile. Il self.request.user è l’oggetto User. Stai eseguendo una query per ottenere un duplicato dello stesso oggetto a cui fa già riferimento la richiesta.

Dovresti rimuovere quella query e utilizzare:

Inoltre, non è necessario un ciclo “for” qui: ti ho fornito l’espressione nella mia risposta precedente affinché la query identifichi tutti gli oggetti non selezionati.

— the original English —

Again, this is totally unnecessary. The self.request.user is the User object. You’re executing a query to get a duplicate of the same object that is already referenced by the request.

You should remove that query and use:

Also, there’s no need for a for loop here - I gave you the expression in my previous response for the query to identify all of the non-selected objects.