JAYESH rathi
JAYESH rathi

Reputation: 45

i am getting error after trying to extend user model using one to one link

error i am receiving IntegrityError at /washer/ my code code inside my models.py

class washers(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    mobile=models.IntegerField()
    added_by=models.CharField(max_length=100,blank=True,null=True)
@receiver(post_save, sender=User)
def save_user_washers(sender, instance, **kwargs):
    instance.washers.save()
@receiver(post_save, sender=User)
def create_user_washers(sender, instance, created, **kwargs):
    if created:
        washers.objects.create(user=instance)

code inside views.py

def wash(request):
    wf=washerform()
    uf=Userform()
    if request.method=="POST":
        uf=Userform(data=request.POST)
        wf=washerform(data=request.POST)
        if uf.is_valid() and wf.is_valid():
            uf.save()
            wf.save()
            return HttpResponse("suscess fully crated ")
    return render(request,'webpage/washer.html',{'fm':wf,'uf':uf})

Upvotes: 1

Views: 76

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477607

It means you did not log in, so request.user is not a User object. You need to enforce that only people who are logged in can see and update the page. You can do this with a @login_required decorator [Django-doc]:

from django.contrib.auth.decorators import login_required

@login_required
def wash(request):
    if request.method == 'POST':
        uf = Userform(request.POST, request.FILES, instance=request.user)
        wf = washerform(request.POST, request.FILES, instance=request.user.washers)
        if uf.is_valid() and wf.is_valid():
            uf.save()
            wf.save()
            return HttpResponse("suscess fully crated ")
    else:
        wf = washerform()
        uf=Userform()
    return render(request,'webpage/washer.html', {'fm':wf,'uf':uf})

or if you want to register a washers, you should remove the signal that creates a washer and work with:

# remove the signal that creates a washers object.

def wash(request):
    if request.method == 'POST':
        uf = Userform(request.POST, request.FILES)
        wf = washerform(request.POST, request.FILES)
        if uf.is_valid() and wf.is_valid():
            user = uf.save()
            wf.instance.user = user
            wf.save()
            return HttpResponse("suscess fully crated ")
    else:
        wf = washerform()
        uf=Userform()
    return render(request,'webpage/washer.html', {'fm':wf,'uf':uf})

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

Upvotes: 1

Related Questions