Передача переменной из 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' )

Полагаю, что всегда можно прикрепить весь запрос или даже все представление к экземпляру объекта, если вы действительно этого хотите. С той же оговоркой о дефолте или понятном отказе.

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