簡體   English   中英

無法在 django model 中獲取當前登錄用戶

[英]Not able to get current logged in user in django model

我正在嘗試通過我的 model 獲取當前登錄用戶,以便我只能在我的訂單頁面下拉列表中看到當前用戶:

  1. 我瀏覽了很多 state 的文檔,在 model 中獲取當前登錄用戶並不容易或不可行。

  2. 我嘗試了其他方法,例如獲取 AUTH_USER_MODEL,但它也返回了管理員級別的用戶,因此無法解決問題。

  3. 我還從我的視圖文件中發送當前登錄的用戶,但不知道如何在 class 中訪問它,能夠在init中訪問它,但不知道如何在 class 中訪問它。

模型.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']

視圖.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()))

我得到的是所有用戶:

在此處輸入圖像描述

我想要的是只在下拉列表中顯示當前用戶。

請幫助或指導我正確的方向。

提前致謝!!

就像是

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),
        }

應該足夠了。

因此,我嘗試了一種解決方案,而這一項工作,雖然我之前嘗試過,但在 100 份文檔和解決方案之間,簡單的解決方案迷路了:

在我的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']

我排除了客戶字段,而是在我的視圖中填充了它。 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() 並在保存視圖時在視圖本身中構建當前登錄的用戶。 它也在數據庫中存儲相同的用戶。

編輯:

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,'app_name/placeorder.html',context)
    except:
        print("Error occurred : {exec}".format(exec=traceback.format_exc()))

所以我已經更改了我的表格 object 並且我不再將我當前的登錄用戶發送到 forms 所以只需創建沒有“instance=customer”的 object 就可以獲得我當前的登錄用戶。

現在我們不需要在 createorderform 形式的 init 方法中處理實例:

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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM