Новичок Django здесь, я создал простую форму после этого учебника, и моя форма правильно сохраняет данные в моей локальной базе данных, связанной с Postgres.Затем я использовал сигнал для запуска post_save, чтобы я мог запустить свой собственный код.Я узнал этот вопрос . Теперь, когда пользователь вводит данные в форму и сохраняет их, что вызывает пользовательский код, который выполняет некоторую постобработку, я хочу показать пользователю новую страницу с вновь обработанными данными. НоФункция триггера, которую я использовал, не позволяет мне передавать аргументы пользовательской функции кода.Перед этим я смог показать пользователю новую страницу с некоторыми примерами данных и отобразить страницу с новыми данными.Но теперь я хочу сделать это только тогда, когда пользователь вводит некоторые данные.Это правильный подход?Все мои шаблоны работают нормально, а пользовательский код заполняет переменные типа rocode.vehicleroute
строковыми значениями.
Вот мой код:
views.py
from django.shortcuts import render
from django.http import HttpResponse
from .forms import auditform, ClientAuditForm
from django.db.models.signals import post_save
from .models import auditModel
def clientauditingfun(request):
if request.method == 'POST':
forminput = ClientAuditForm(request.POST)
if forminput.is_valid():
Preference = forminput.cleaned_data['Preference']
ClientAddress = forminput.cleaned_data['ClientAddress']
DispatchType = forminput.cleaned_data['DispatchType']
ETA = forminput.cleaned_data['ETA']
print("Data saved succesfully")
forminput.save()
forminput = ClientAuditForm(request.POST)
return render(request, 'auditing/auditform.html', {'forminput': forminput} )
def my_handler(sender, instance, created, **kwargs):
print("trigger running")
if created:
from . import rocode
import itertools
print("function my_handler running inside")
rocode.main() # this is my custom code which fills the values of all the variables given below
data1 = list(itertools.zip_longest(rocode.vehicleroute, rocode.routepath, rocode.routeduration, rocode.routeETA,
rocode.routedistance, rocode.routelink, rocode.routetotaldistance))
return render( '','auditing/routput.html', {'data': data1})
post_save.connect(receiver=my_handler, sender=auditModel)
forms.py
from django import forms
from .models import auditModel
class ClientAuditForm(forms.ModelForm):
class Meta:
model = auditModel
fields = ('Origin','Destination','MaterialType','GSTIN','Name','Preference','ClientAddress','DispatchType','ETA')
models.py
from django.db import models
class auditModel(models.Model):
Origin = models.CharField(max_length=100,null=True)
Destination = models.CharField(max_length=100,null=True)
MaterialType = models.CharField(max_length=100,null=True)
Preference = models.CharField(max_length=100,null=True)
ClientAddress = models.CharField(max_length=100,null=True)
Name = models.CharField(max_length=100,null=True)
GSTIN = models.IntegerField(null=True)
DispatchType = models.CharField(max_length=100,null=True)
ETA = models.CharField(max_length=100,null=True)
def _str_(self):
return self.Origin
Вот функция, которую я использовал для запуска пользовательского кода, но она все время выполнялась в файле views.py,и он прекрасно отрисовывал страницу.Но теперь все, что я хочу, - это запускаться только при сигнале триггера post_save.
def read_file(request):
import itertools
data1 = list(itertools.zip_longest(rocode.vehicleroute, rocode.routepath, rocode.routeduration, rocode.routeETA,
rocode.routedistance, rocode.routelink,
rocode.routetotaldistance))
return render(request, "input.html", {'data': data1})