Сохранение данных без использования формы в Django
У меня есть одно приложение, в котором нужно сохранить данные без использования формы. Сценарий будет заключаться в том, что потенциальный сотрудник сохраняет доступные предложения о работе. Проблема в том, что ничего не сохраняется.
@login_required #here employee reserves that offered jobs on job list
def reserve_shift(request, pk):
shift = Shift.objects.get(id=pk)
if request.method == 'POST':
user=request.user
reserve_shift.objects.save()
return redirect('reserved_shifts')
@login_required #the view to all shifts that employee reserved
def reversed_shifts(request):
user=request.user
reserved_shifts=ShiftReservation.objects.all()
context={'reserved_shifts':reserved_shifts,'user':user}
return render(request,'reserved_shifts.html',context)
вот модель, унаследованная от класса Shift
class Shift(models.Model):
employer=models.ForeignKey(Employer,on_delete=models.CASCADE)
pub_date=models.DateTimeField('Date published',auto_now_add=True)
updated_date = models.DateTimeField(auto_now_add=True,null=True, blank=True)
address=models.ForeignKey(AddressBook,on_delete=models.CASCADE,related_name="shift_street")
shift_date=models.DateTimeField('Date')
start_time = models.TimeField()
finish_time = models.TimeField()
published = models.BooleanField(default=False)
details=models.CharField(max_length=200, blank=True, null=True)
def __str__(self):
return f'{self.pub_date}'
class ShiftReservation(Shift):
user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
time_reserved = models.DateTimeField(auto_now_add=True)
Как я должен это сделать? Спасибо!
Итак, ваша проблема в том, что вы пытаетесь сохранить объект, который вы никогда не инициализировали в методе reserve_shift
. Вам нужно либо создать и инициализировать объект reserved_shift
, имеющий атрибуты объекта shift
, который вы извлекли, либо сделать что-то еще.
Я бы рекомендовал отказаться от идеи иметь отдельные модели для зарезервированных и общих сдвигов, поскольку это создает больше проблем, чем решений, по крайней мере, в этом небольшом примере.
Для рефакторинга кода вам просто нужно переместить два атрибута ShiftReserved
в модель Shift
и включить null, чтобы они могли быть пустыми для незарезервированных сдвигов.
class Shift(models.Model):
employer=models.ForeignKey(Employer,on_delete=models.CASCADE)
pub_date=models.DateTimeField('Date published',auto_now_add=True)
updated_date = models.DateTimeField(auto_now_add=True,null=True, blank=True)
address=models.ForeignKey(AddressBook,on_delete=models.CASCADE,related_name="shift_street")
shift_date=models.DateTimeField('Date')
start_time = models.TimeField()
finish_time = models.TimeField()
published = models.BooleanField(default=False)
details=models.CharField(max_length=200, blank=True, null=True)
user=models.ForeignKey(get_user_model(),on_delete=models.CASCADE, blank=True, null=True)
time_reserved = models.DateTimeField(auto_now_add=True, blank=True, null=True)
def __str__(self):
return f'{self.pub_date}'
Это означает, что следующий код для views.py
должен работать. Не забудьте соответствующим образом отрефакторить зарезервированное представление сдвига!
@login_required #here employee reserves that offered jobs on job list
def reserve_shift(request, pk):
shift = Shift.objects.get(id=pk)
if request.method == 'POST':
shift.user = request.user
shift.time_reserved = datetime.datetime.now()
shift.save()
return redirect('reserved_shifts')