Sådan tilføjes Array Field i Python Django

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver et E-handelssite, jeg vil gemme Cart-elementer i et heltals Array-felt. Jeg bruger PostGreSql som min database.
Jeg har lavet model til vogn ved at udvide Django User model. Her er mine modeller


class UserCart(models.Model):
    user=models.OneToOneField(User,on\_delete=models.CASCADE)
    user\_product=models.IntegerField(blank=True, null=True)
    cart\_products = ArrayField(
        models.IntegerField(blank=True),
        default = list
    )

User.profile = property(lambda u:UserCart.objects.get\_or\_create(user=u)[0])


Nedenfor er min Form.py. Jeg har kun oprettet en grundlæggende formular
    fra django import former
    fra .models importere UserCart
    fra django.db import modeller
    fra django.contrib.postgres.fields importere ArrayField


class UserCartForm (forms.ModelForm):

    class Meta:
        model= UserCart
        fields = ('user\_product',)


Jeg har søgt meget på internettet, men kunne ikke finde det relevante svar. Jeg vil have det, når brugeren klikker på knappen Tilføj til indkøbsvogn, bliver den product\_id gemt i cart\_products array.I læser et sted, som ArrayFields opfører sig som liste i Django, så her er min views.py


@login\_required
def user\_cart(request):
    if request.method=='POST':
        form=UserCartForm(request.POST , instance=request.user.profile)
        if form.is\_valid():
            post = form.save(commit=False)
            post.cart\_products.append(99)
            post.save()
            return HttpResponseRedirect('/user\_login/loggedin')
        else:
            HttpResponse("Error")
    else:
        user=request.user
        profile=user.profile
        form= UserCartForm(instance=profile)
        args={}
        args.update(csrf(request))
        args['form']=form
        return render\_to\_response('cartapi.html' ,args)


Det giver mig fejl


 AttributeError at /cart/ac/
 'NoneType' object has no attribute 'append'
 Request Method:    POST
 Request URL:   http://localhost:8000/cart/ac/
 Django Version:    1.11.2
 Exception Type:    AttributeError
 Exception Value:   
 'NoneType' object has no attribute 'append'
 Exception Location:    C:UsersMuhammad                
 JawadAppDataLocalProgramsPythonPython36-32mysitecartviews.py in 
 user\_cart, line 19
 Python Executable: C:UsersMuhammad 
 JawadAppDataLocalProgramsPythonPython36-32python.exe


Og hvis jeg redder cart\_products på denne måde


 post.cart\_products=99


Så kaster den denne fejl


 column "cart\_products" is of type int4range but expression is of type integer
 LINE 1: ...er\_id" = 1, "user\_cart" = 3000, "cart\_products" = 99 WHERE "...
                                                         ^
 HINT:  You will need to rewrite or cast the expression.
 Request Method:    POST
 Request URL:   http://localhost:8000/cart/ac/
 Django Version:    1.11.2
 Exception Type:    ProgrammingError
 Exception Value:   
 column "cart\_products" is of type int4range but expression is of type integer
 LINE 1: ...er\_id" = 1, "user\_cart" = 3000, "cart\_products" = 99 WHERE "...
                                                         ^
 HINT:  You will need to rewrite or cast the expression.


Vær venlig at hjælpe mig i denne sag. Summarizing my Question:
Hvordan kan jeg få user\_product som id og gemme det i cart\_products

Bedste reference


ændre yor synspunkter som denne


views.py



@login\_required
def user\_cart(request):
    if request.method=='POST':
        form=UserCartForm(request.POST , instance=request.user.profile)
        if form.is\_valid():
            post = form.save(commit=False)
            if post.cart\_products:
                post.cart\_products.append(99)
            else:
                post.cart\_products = [99]
            post.save()
            return HttpResponseRedirect('/user\_login/loggedin')
        else:
            HttpResponse("Error")
    else:
        user=request.user
        profile=user.profile
        form= UserCartForm(instance=profile)
        args={}
        args.update(csrf(request))
        args['form']=form
        return render\_to\_response('cartapi.html' ,args)

Andre referencer 1


Med den nuværende kode ser det godt ud, men af ​​en eller anden grund er cart\_products None, så du kan prøve denne vej


if post.cart\_products:
    post.cart\_products.append(99)
else:
    post.cart\_products = [99]