У меня есть метод сохранения на моей модели, который я бы хотел использовать для проверки полей (раньше я делал это в своих представлениях, но это было просто грязно!). Я сохраняю объект, а не форму, потому что у меня были некоторые трудности с проверкой формы.Сохранить метод не запускается на объекте save
Я раньше не использовал методы сохранения, но я предполагаю, что они срабатывают, когда вы используете команду .save()? Моя не запускается вообще ... Также из того, что я понимаю, метод clean() запускается для форм, когда вы используете is_valid(), поэтому для меня это не полезно?
Вот мое мнение, что сохраняет объект с помощью 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)
И вот здесь я попытался написать метод сохранения ... Я планирую иметь гораздо больше функцию проверки, чтобы проверить, если даты относятся к определенным дням, но пока я просто хочу заставить это работать.
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"
Спасибо!
Edit: здесь Аякс позвонить
$(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");
}
});
};
})
URL-адрес:
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'),
]
Вы уверены, что на самом деле вызывается POST? Вы видите «создание расписания»? –
Нет, я не вижу создания расписания. Все работало нормально, я получаю данные с Ajax и отправляю их в это представление, чтобы избежать обновления страницы. Затем вызовите представление в Ajax. Поскольку я добавил метод сохранения, он прекратил делать что-нибудь ... –
Можете ли вы показать нам вызов ajax? Скорее всего, отсутствует метод POST. –