Не удается получить текущего вошедшего пользователя в модели django

Я пытаюсь получить текущего зарегистрированного пользователя через мою модель, чтобы я мог видеть только текущего пользователя в выпадающем списке страницы заказа:

  1. Я просмотрел множество документов, в которых говорится, что получить текущего залогиненного пользователя в модели не так уж просто или выполнимо.

  2. Я пробовал другой метод, например, получить AUTH_USER_MODEL, но он возвращает пользователей уровня администратора, так что это не решает проблему.

  3. Я также отправляю текущего зарегистрированного пользователя из моего файла views, но не знаю, как получить доступ к нему внутри класса формы, я могу получить доступ к нему в init, но не знаю, как к нему можно получить доступ в классе.

models.py :

from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.contrib.auth import get_user_model
from django.http import HttpResponse,HttpRequest

class Customer(models.Model):
    name = models.CharField(max_length=200,null=True)
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

class Order(models.Model):
    product = models.ForeignKey(Product,null=True, on_delete=models.SET_NULL)
    #customer = models.ForeignKey(settings.AUTH_USER_MODEL,null=True, on_delete=models.SET_NULL)
    customer = models.ForeignKey(Customer,null=True, on_delete=models.SET_NULL)
    date_ordered = models.DateTimeField(auto_now_add=True)
    status = models.CharField(max_length=20,default= 'PENDING')
    def __str__(self):
        return str(self.customer.id)

forms.py :

class createorderform(ModelForm):
    def __init__(self,*args,**kwargs):
        self._instance=kwargs.pop('instance',None)
        super().__init__(*args,**kwargs)

    #def __init__(self,instance):
    #    self.user = instance
    #    super().__init__(instance)

    class Meta:
        model=Order
        fields="__all__"
        exclude=['status']

Views.py

def placeorder(request,i):
    try:
        products = Product.objects.all()
        customer = Customer.objects.get(id=i)
        print("Customer:",customer)
        #form=createorderform(prod=products,cust=customer)
        form=createorderform(instance=customer)
        #form=createorderform()
        if(request.method=='POST'):
            form=createorderform(request.POST,instance=customer)
            if(form.is_valid()):
                form.save()
                return redirect('/')
        context={'form':form}
        return render(request,'app_name/placeorder.html',context)
    except:
        print("Error occurred : {exec}".format(exec=traceback.format_exc()))

Что я получаю, это все пользователи:

enter image description here

Я хочу, чтобы в выпадающем списке отображался только текущий пользователь.

Пожалуйста, помогите или направьте меня в нужном направлении.

Заранее спасибо!!!

Так что я вроде как попробовал одно решение и оно работает, хотя я пробовал его раньше, но между сотнями документов и решений легкое решение потерялось :

В моем forms.py :

class createorderform(ModelForm):
    def __init__(self,*args,**kwargs):
        self._instance=kwargs.pop('instance',None)
        super().__init__(*args,**kwargs)

    #def __init__(self,instance):
    #    self.user = instance
    #    super().__init__(instance)

    class Meta:
        model=Order
        fields="__all__"
        exclude=['customer','status']

Я исключил поле customer и вместо этого заполнил его в моем views. py:


def placeorder(request,i):
    try:
        products = Product.objects.all()
        customer = Customer.objects.get(id=i)
        print("Customer:",customer)
        #form=createorderform(prod=products,cust=customer)
        form=createorderform(instance=customer)
        #form=createorderform()
        if(request.method=='POST'):
            form=createorderform(request.POST,instance=customer)
            if(form.is_valid()):
                curr_user = form.save(commit=False)
                curr_user.customer = customer
                curr_user.save()
                return redirect('/')
        context={'form':form}
        return render(request,'app_name/placeorder.html',context)
    except:
        print("Error occurred : {exec}".format(exec=traceback.format_exc()))

Так я переопределяю save() и создаю моего текущего зарегистрированного пользователя в самом представлении при его сохранении. Он сохраняет того же пользователя и в db.

EDIT:

def placeorder(request,i):
    try:
        products = Product.objects.all()
        customer = Customer.objects.get(id=i)
        print("Customer:",customer)
        #form=createorderform(prod=products,cust=customer)
        form=createorderform()
        #form=createorderform(instance=customer)
        if(request.method=='POST'):
            form=createorderform(request.POST)
            #form=createorderform(request.POST,instance=customer)
            if(form.is_valid()):
                curr_user = form.save(commit=False)
                curr_user.customer = customer
                curr_user.save()
                return redirect('/')
        context={'form':form}
        return render(request,'ecomm_web/placeorder.html',context)
    except:
        print("Error occurred : {exec}".format(exec=traceback.format_exc()))

Итак, я изменил объект формы и больше не отправляю моего текущего зарегистрированного пользователя в форму, поэтому просто создаю объект без "instance=customer", который получил моего текущего зарегистрированного пользователя.

Теперь нам не нужно обрабатывать экземпляр в методе init формы createorderform :

class createorderform(ModelForm):
    #def __init__(self,*args,**kwargs):
    #    self._instance=kwargs.pop('instance',None)
    #    super().__init__(*args,**kwargs)

    #def __init__(self,instance):
    #    self.user = instance
    #    super().__init__(instance)

    class Meta:
        model=Order
        fields="__all__"
        exclude=['customer','status']

Что-то вроде

from django.forms import ModelForm
from django.views.generic import CreateView


class CreateOrderForm(ModelForm):
    class Meta:
        model = Order
        exclude = ['status', 'customer']

    def __init__(self, **kwargs):
        self.customer = kwargs.pop('customer')
        super().__init__(**kwargs)

    def save(self, commit=True):
        self.instance.customer = self.customer
        return super().save(commit=commit)


class PlaceOrderView(CreateView):
    model = Order
    form_class = CreateOrderForm
    template_name = 'app_name/placeorder.html'

    def get_form_kwargs(self):
        return {
            **super().get_form_kwargs(),
            'customer': Customer.objects.get(user=self.request.user),
        }

должно быть достаточно.

Вернуться на верх