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)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.