0

I am trying to add an object(Project) to an another object TimeSheet. When i am trying to do that I am getting an error saying that

"RelatedObjectDoesNotExist at /accounts/addtimesheet/ - TimeSheet has no project."

Though I had project in TimeSheet as a ForeignKey to the Project Model.

I think I have missed something in my models.py while file while creating Project Model.Can someone help me what did i miss.

model.py

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  emp_name = models.CharField(max_length=500)
  gender = models.CharField(max_length=10)
  job_position = models.CharField(max_length=20)
  salary = models.IntegerField()

def __str__(self):
    return self.emp_name

class Project(models.Model):
  project_name = models.CharField(max_length=200)
  employees = models.ManyToManyField(Profile)

  def __str__(self):
    return self.project_name

class TimeSheet(models.Model):
  employees = models.ManyToManyField(Profile)
  emp_name = models.CharField(max_length=100, default='emp_name')
  date  = models.DateField()
  start_time = models.TimeField()
  end_time = models.TimeField()
  project = models.ForeignKey(Project, on_delete=models.CASCADE)

  def __str__(self):
    return self.emp_name + ' ' + self.project.project_name +' '+ str(self.date)    

views.py

def add_timesheet(request):
if request.user.is_authenticated:
    if request.method == 'POST':
        timesheet = TimeSheet()
        print(request.user)
        timesheet.employees.set(request.user)
        timesheet.save()
        timesheet.date = request.POST['date']
        timesheet.start_time = request.POST['from']
        timesheet.end_time = request.POST['to']
        timesheet.project_set.add(Project.objects.filter(id=request.POST.get('project_id'))[0])
        #timesheet.project = project_name
        timesheet.save()
        id = request.user.id
        emp_profile = Profile.objects.filter(user=id)[0] # get the profile object of the logged in user
        projects = emp_profile.project_set.all()         # use the profile object to get his projects
        return render(request, 'accounts/project.html', {'projects':projects})
    else:
        project_name = request.GET.get('project_name')
        return render(request, 'accounts/add_timesheet.html', {'project_name':project_name})
else:
    return render(request, 'accounts/login.html', {'error': 'Login to access the page'})

full trace back:

Internal Server Error: /accounts/addtimesheet/
Traceback (most recent call last):
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py", line 35, in inner
response = get_response(request)
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\computer\Desktop\django\TMS_1\TMS_1\TMS\accounts\views.py", line 49, in add_timesheet
    timesheet.employees.set(request.user)
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\related_descriptors.py", line 498, in __get__
    return self.related_manager_cls(instance)
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\related_descriptors.py", line 795, in __init__
(instance, self.pk_field_names[self.source_field_name]))
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\base.py", line 513, in __repr__
    return '<%s: %s>' % (self.__class__.__name__, self)
  File "C:\Users\computer\Desktop\django\TMS_1\TMS_1\TMS\accounts\models.py", line 32, in __str__
    return self.emp_name + ' ' + self.project.project_name +' '+ str(self.date)
  File "C:\Users\computer\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django\db\models\fields\related_descriptors.py", line 175, in __get__
    "%s has no %s." % (self.field.model.__name__, self.field.name)
django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist: TimeSheet has no project.
[23/Mar/2018 15:46:12] "POST /accounts/addtimesheet/ HTTP/1.1" 500 87076
Tapas Balu
  • 15
  • 3

2 Answers2

0

Try this rather than setting user

timesheet.employees = Profile.objects.get(user = request.user)
yepyep
  • 15
  • 1
  • 5
0

There is no Revere FK relation from timestamp to project. So it should be something like this,
timestamp.project = some_project_instance

Also, You should be aware of the difference between filter and get in django
Try this in your view.py

def add_timesheet(request):


    if request.user.is_authenticated:
        if request.method == 'POST':
            timesheet = TimeSheet()
            print(request.user)
            timesheet.employees.set(request.user)
            timesheet.save()
            timesheet.date = request.POST['date']
            timesheet.start_time = request.POST['from']
            timesheet.end_time = request.POST['to']
            # Changes
            timesheet.project = Project.objects.get(id=request.POST.get('project_id'))
            timesheet.save()
            emp_profile = Profile.objects.get(user=request.user)
            projects = emp_profile.project_set.all()  # use the profile object to get his projects

            return render(request, 'accounts/project.html', {'projects': projects})
        else:
            project_name = request.GET.get('project_name')
            return render(request, 'accounts/add_timesheet.html', {'project_name': project_name})
    else:
        return render(request, 'accounts/login.html', {'error': 'Login to access the page'})
JPG
  • 82,442
  • 19
  • 127
  • 206