簡體   English   中英

將變量從 views.py 傳遞到 models.py django

[英]Passing a variable from views.py to models.py django

我對編程還是很陌生。

我的問題是我有 2 個模型,一個用於銷售,一個用於代理。

現在要呈現每個代理和他們所做的銷售(具有不同的屬性),我需要在我的銷售 model 下編寫 model 方法,以允許我在模板中調用它們。

現在我的問題是,我希望能夠呈現確切的東西,但是在用戶選擇的日期之前,我已經嘗試通過我的項目文件手動執行此操作並且它有效,但我想知道是否可以擁有這些值從用戶移動到我的方法? 我的意思是導航欄中有一個基本表單,允許用戶選擇開始日期和截止日期,但我不確定如何根據需要此日期范圍的方法將這些值傳遞到我的 models.py 中應用。

我將展示一個例子。

#this is my view that grabs relevant dates
def asearch_stats(request):
    if request.method == 'POST':
        from_date = request.POST['from']
        to_date = request.POST['to']
        return render(request,"Sales/salesfilter.html",{"flookup":flookup})


# this is my model with the methods I'm referring to below:
class SalesAgent(models.Model):
    user = models.OneToOneField(User,on_delete=models.SET_NULL,null=True,related_name="sauser")
    SA_name = models.CharField(max_length=40)
    role = models.CharField(choices=Roles,default="default",max_length=13)
    def __str__(self):
        return self.user.username

    #FILTERED SEARCH
# I need those dates on the below ones to be the variables like something like this
    def get_dates(request):
        if request.method == 'POST':
            from_date = request.POST['from']
            to_date = request.POST['to']

    def sfget_totals(self):
        return self.agent_sale.filter(Date_created__gte=(from_date),Date_created__lte=(to_date))
    def sfget_confirmed(self):
        return self.agent_sale.filter(State="Confirmed",Date_created__gte=('2022-03-01'),Date_created__lte=('2022-03-02'))
    def sfget_debi(self):
        return self.agent_sale.filter(AcknowledgeQA=True,State="Confirmed",Debi_status="Accepted",Date_created__gte=('2022-03-01'),Date_created__lte=('2022-03-02'))
    def sfget_requested(self):
        return self.agent_sale.filter(Debi_status="Requested",Date_created__gte=('2022-03-01'),Date_created__lte=('2022-03-02'))
    def sfget_cancelled(self):
        return self.agent_sale.filter(State="Cancelled",Date_created__gte=('2022-03-01'),Date_created__lte=('2022-03-02'))
    def sfget_pending(self):
        return self.agent_sale.filter(State="Pending",Date_created__gte=('2022-03-01'),Date_created__lte=('2022-03-02'))



你不能。 模型封裝和抽象數據庫表。 視圖存在於更高級別。 model 不能引用“它的”視圖,因為 model 實例可以在沒有任何視圖的情況下存在。 例如,當您在執行管理命令或 shell 或 Celery 任務時。

也許這些方法應該是(基於類的)視圖方法,而不是 object 方法。 沒有理由不能將視圖傳遞給模板。 基於類的視圖默認執行他的操作(作為上下文變量view

如果您希望有 model 個實例方法依賴於導航欄中的開始日期和結束日期,則必須將它們傳入。

class SalesAgent(models.Model):
...

    def method(self, from_date, to_date)

您將從您的視圖中調用此方法,它類似於

   agent = SalesAgent.objects.get( ...)
   agent.method( from_date = request.POST['from'], to_date = request.POST['to']  )

有可能(如果有點“hacky”在您的視圖中“標記”一個 object,這樣一整套方法就不需要明確告知這些日期

   agent = SalesAgent.objects.get( ...)
   agent._from_date = request.POST['from']
   agent._to_date   = request.POST['to']

現在,您必須確保依賴於這些字段的代碼正常失敗(或應用默認值):

def method( self):
    from_date = getattr( self, '_from_date', datetime.date( 1900,1,1) )
    to_date = getattr( self, '_to_date', datetime.date.today() )

如果未應用郵票,則默認設置(明智地?)。 或者,

if not hasattr( self, '_to_date'):
    raise AttributeError (
        'SalesAgent object method "method" has been called in an invalid context: instance attribute "_to_date" is not yet set' )

我想總是可以將整個請求甚至整個視圖附加到 object 實例,如果你真的想要的話。 關於違約或失敗的警告也是可以理解的。

暫無
暫無

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

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