Передача переменной из views.py в models.py django
Я все еще очень новичок в программировании.
Моя проблема в том, что у меня есть 2 модели, одна для продажи и одна для агента.
Теперь, чтобы отобразить каждого агента и продажи, которые они сделали (с различными атрибутами) уникально, мне нужно было написать методы модели в моей модели продаж, чтобы я мог вызвать их в шаблоне.
Теперь моя проблема заключается в следующем, я хочу иметь возможность отображать именно это, но по датам, которые выбирает пользователь, я пробовал делать это вручную через файлы проекта и это работает, но я хочу знать, возможно ли перенести эти значения от пользователя в мой метод? Я имею в виду, что есть основная форма в навигационной панели, которая позволяет человеку выбрать дату от и до, но эти значения я не уверен, как передать их в мой 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'))
Вы не можете. Модели инкапсулируют и абстрагируют таблицы базы данных. Представления существуют на более высоком уровне. Модель не может ссылаться на "свое" представление, потому что экземпляр модели может существовать вообще без представления. Например, когда вы работаете в команде управления, или оболочке, или задаче Celery.
Возможно, эти методы должны быть (основанными на классе) методами представления, а не методами объекта. Нет причин, по которым вы не можете передать представление в шаблон. Представления на основе классов делают это по умолчанию (как контекстная переменная view)
Если вы хотите иметь методы экземпляра модели, которые зависят от дат from и to из навигационной панели, вы должны передать их.
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'] )
Возможно (если немного "халтурно") "штамповать" объект в вашем представлении так, чтобы целой куче методов не нужно было явно сообщать об этих датах
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' )
Полагаю, что всегда можно прикрепить весь запрос или даже все представление к экземпляру объекта, если вы действительно этого хотите. С той же оговоркой о дефолте или понятном отказе.