Сохранение данных без использования формы в 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')
Вернуться на верх