PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Wednesday, October 19, 2022

[FIXED] How to connect 2 models in the admin, if they are already connected OnetoOne?

 October 19, 2022     admin, django, python     No comments   

Issue

models.py


    from django.contrib.auth.models import User
    
    class Customer(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, 
        blank=True)

Every time for new user (when he registers and try login) I must choose user in admin ('in Customer model') see https://prnt.sc/waTmROxj3-xn for a screenshot), if I don't choose a new user I have error RelatedObjectDoesNotExist at / User has no customer(when user try to login). How to do it automatically? What I did do wrong?

It is possible to catch this exception, but then what data should be added to the customer to connect it? It won't change the user's flag to his own (https://prnt.sc/waTmROxj3-xn(screenshot)):

views.py

    def cartData(request): 
        if request.user.is_authenticated:
            try:
                customer = request.user.customer
            except ObjectDoesNotExist:
                customer = ?
                
    
            order, created =Order.objects.get_or_create(customer=customer, 
            complete=False)
            items = order.orderitem_set.all()
            cartItems = order.get_cart_items
        else:
            cookieData = cookieCart(request)
            cartItems = cookieData['cartItems']
            order = cookieData['order']
            items = cookieData['items']
        return {'cartItems': cartItems, 'order': order, 'items': items}
    ```
    
    def register(request): #Register user
        form = CreateUserForm()
    
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
    
            if form.is_valid():
                form.save()
    
                user = form.cleaned_data.get('username')
                messages.success(request, f'Account created for {user} ')
                return redirect('index')
    
    
    def login_user(request): # Try to login
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
    
            user = authenticate(request, username=username, 
            password=password)
            
            if user is not None:
                login(request, user)
                return redirect('index')
            else:
                messages.info(request, "Wrong password or username.")
                return redirect('login')

    def processOrder(request):
    transaction_id = datetime.datetime.now().timestamp()
    data = json.loads(request.body)

    if request.user.is_authenticated:
        customer = request.user.customer
        # it is possible to change the method like this: customer = Customer.objects.filter(pk=id).update(email=email, last_name=last_name, phone=phone,)
        order, created = Order.objects.get_or_create(customer=customer, complete=False)


    else:
        customer, order = guestOrder(request, data)

Solution

if you want to extend the user model - you can: You can extend the default User model, or substitute a completely customized model.

Create child model from user:

from django.contrib.auth.models import User

class Customer(User):
    # you dont need user field any more

Create you own user:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    # you dont need the customer any more

https://docs.djangoproject.com/en/4.1/topics/auth/customizing/

After 1 or 2 you don't need create additional user object, it should be automatically.

in your code with your models:

if request.user.is_authenticated:
    try:
        customer = request.user.customer
    except ObjectDoesNotExist:
        customer = Customer(user=request.user)
        customer.save()


Answered By - Maxim Danilov
Answer Checked By - Clifford M. (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

1,206,170

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © 2025 PHPFixing