Выполните некоторую постобработку после отправки формы и создайте новую страницу с вновь обработанными данными. - PullRequest
0 голосов
/ 24 марта 2019

Новичок 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})

1 Ответ

1 голос
/ 24 марта 2019

Нет, это не правильный подход.Сигналы не могут перенаправить ответы клиенту, поэтому нет смысла отображать там шаблон.

Вы должны перенаправить после сохранения на новый URL-адрес, который берет идентификатор вновь созданного объекта и отображать шаблон оттуда.

...