2017-02-03 1 views
0

Ich habe eine Speichermethode auf meinem Modell, die ich verwenden möchte, um die Felder zu validieren (ich tat dies in meinen Ansichten vor, aber es war einfach chaotisch!). Ich speichere ein Objekt und nicht ein Formular, da ich Schwierigkeiten mit der Formularvalidierung hatte.Speichern Methode löst nicht auf Objekt speichern

Ich habe keine Speichermethoden zuvor verwendet, aber ich nehme an, dass sie ausgelöst werden, wenn Sie den Befehl .save() verwenden? Meines wird überhaupt nicht ausgelöst ... Auch von was ich verstehe, wird eine saubere() Methode für Formulare ausgeführt, wenn Sie is_valid() verwenden, also ist das für mich hier nicht nützlich?

Hier ist meine Ansicht, die ein Objekt speichert Ajax

@login_required 
def createtimesheet(request): 
    if request.method == "POST": 
     print "creating timesheet" 
     # Get the person from the previous view 
     person_object = request.session.get('person') 
     person = Person.objects.get(id=person_object) 
     # get the POST data 
     start_date = request.POST.get('datestart') 
     end_date = request.POST.get('dateend') 
     start_date_formatted = datetime.strptime(start_date, "%m/%d/%Y") 
     end_date_formatted = datetime.strptime(end_date, "%m/%d/%Y") 
     start_date_print = start_date_formatted.strftime("%B")[0:3] + ". " + start_date_formatted.strftime("%d") + ", " + start_date_formatted.strftime("%Y") 
     end_date_print = end_date_formatted.strftime("%B")[0:3] + ". " + end_date_formatted.strftime("%d") + ", " + end_date_formatted.strftime("%Y") 

     response_data = {} 

     # create our messages 
     message = "" 
     error = "" 

     todays_date = datetime.now() 
     print_date = todays_date.strftime("%A")  

     # now we can create the timesheet! 
     peach = TimeSheet(start_date=start_date_formatted, end_date=end_date_formatted, person_id=person) 
     # need an if valid.....? 
     peach.save() 
     message = "Created new timesheet" 

     response_data['startdate'] = start_date_print 
     response_data['enddate'] = end_date_print 
     response_data['status'] = peach.status 
     print response_data 

     context = { 
      "person": person, 
      "message": message, 
      "error": error, 
      "print_date": print_date, 
      "todays_date": todays_date, 
     } 

     return JsonResponse(response_data) 

mit Und hier ist, wo ich versucht haben, eine speichern Methode zu schreiben ... Ich bin eine viel längere Validierungsfunktion haben Planung, wenn zu prüfen Die Daten fallen an bestimmten Tagen, aber für den Moment möchte ich das nur zur Arbeit bringen.

class TimeSheet(models.Model): 

    O = "Open" 
    S = "Submitted" 
    A = "Approved" 
    R = "Needs review" 

    STATUS_CHOICES = (
    (O, "Open"), 
    (S, "Submitted"), 
    (A, "Approved"), 
    (R, "Needs Reviewing"), 
    ) 

    start_date = models.DateField() 
    end_date = models.DateField() 
    person_id = models.ForeignKey(Person) 
    status = models.CharField(max_length= 50, default="Open", choices=STATUS_CHOICES) 
    submitted_id = models.IntegerField(default=0) 
    approved_id = models.IntegerField(default=0) 
    submitted_date = models.DateTimeField(auto_now_add=True, blank=True) 
    approved_date = models.DateTimeField(auto_now_add=True, blank=True) 

    # def __str__(self): 
    # return self.id 

    def get_absolute_url(self): 
     return reverse('tande:timesheet', kwargs={'id': self.id}) 

    def __init__(self, *args, **kwargs): 
     print "initiating a timesheet" 
     super(TimeSheet, self).__init__(*args, **kwargs) 

    def save(self, *args, **kwargs): 
     print "something is trying to save!" 
     ok_to_continue = True 
     start_date = self.start_date 
     end_date = self.end_date 
     if ok_to_continue: 
      if end_date < start_date: 
       error = "Start date must be before end date" 
       ok_to_continue = False 
     if ok_to_continue: 
      super(TimeSheet, self).save(*args, **kwargs) 
     else: 
      print "def save did not work" 

Vielen Dank!

Edit: Hier ist die Ajax-Aufruf

$(document).ready(function() { 

$('#timesheet-form').on('submit', function(event){ 
    event.preventDefault(); 
    console.log("add a timesheet"); 
    createtimesheet(); 
}); 

function createtimesheet() { 
    console.log("create timesheet is working!") 
    $.ajax({ 
     url : "{% url 'tande:createtimesheet' %}", 
     type: "POST", 
     data: { datestart : $('#start').val(), dateend : $('#end').val()}, 

     success : function(json) { 
      $('#start').val(''); 
      $('#end').val(''); 

      console.log(json); 
      var html = '<tr><td>'+json.startdate+'</td><td>'+json.enddate+'</td><td>'+json.status+'</td><</tr>'; 
      console.log("success"); 
      // $('div#talk').html(html); 
      $('#timesheet-list').append(html); 
      console.log(html) 
      overlay(); 
     }, 

     error : function(xhr,errmsg,err) { 
      // $('#results').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+ 
      //  " <a href='#' class='close'>&times;</a></div>"); // add the error to the dom 
      console.log("uh oh"); 
      } 
     }); 
    }; 
}) 

URLs:

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^people/$', views.people, name='people'), 
    url(r'^people/create_person/$', views.create_person, name='create_person'), 
    url(r'^(?P<person_id>[0-9]+)/person/$', views.person, name='person'), 
    url(r'^person/createtimesheet/$', views.createtimesheet, name='createtimesheet'), 

    url(r'^(?P<timesheet_id>[0-9]+)/person/timesheet/$', views.timesheet, name='timesheet'), 

] 
+0

Sind Sie sicher, dass die Ansicht tatsächlich mit POST aufgerufen wird? Siehst du das 'creating timesheet'? –

+0

Nein Ich sehe die Erstellung der Arbeitszeittabelle nicht. Es funktionierte alles gut Ich bekomme die Daten mit Ajax und sende es an diese Ansicht, um eine Seitenaktualisierung zu vermeiden. Rufen Sie dann die Ansicht in Ajax auf. Seit ich eine Speichermethode hinzugefügt habe, wird alles gestoppt ... –

+0

Kannst du uns den Ajax-Ruf zeigen? Vermutlich fehlt die POST-Methode. –

Antwort

0

Form-ID nicht die ID in der Ajax-Aufruf brachte ...

id in html 'create-timesheet-form' und ajax hat 'timesheet-form' aufgerufen

-.-

Verwandte Themen