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'>×</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'),
]
Sind Sie sicher, dass die Ansicht tatsächlich mit POST aufgerufen wird? Siehst du das 'creating timesheet'? –
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 ... –
Kannst du uns den Ajax-Ruf zeigen? Vermutlich fehlt die POST-Methode. –