У объекта 'User' нет атрибута 'staffUser'

Я настроил модель пользователя с помощью Django One To One Field

Мой models.py

class StaffUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.ForeignKey(Dept, on_delete=models.RESTRICT)

    def __str__(self):
        return self.user.username

При загрузке формы я хочу получить отдел пользователя

'My Views.py'

   def FileUploadForm(request, pk):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(commit=False)
            u = User.objects.get(username=request.user)
            form.instance.username = u
            folder = Folder.objects.get(id=pk)
            department = u.staffUser.department
            form.save()
            messages.success(request, f'File Successfully uploaded to {folder} in {department}!')
            return redirect('home')
    else:
        form = UploadFileForm()

    context = {'pk':pk, 'form':form}
    return render(request, "pages/fileup_form.html", context)

Но он выдает ошибку AttributeError at /file/new/1 Объект 'User' не имеет атрибута 'staffUser'

Пожалуйста, ребята, мне нужна помощь

Добавьте related_name на ваше пользовательское поле в StaffUser модели

class StaffUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=staff_user)
    department = models.ForeignKey(Dept, on_delete=models.RESTRICT)

    def __str__(self):
        return self.user.username

Теперь вы сможете получить доступ к StaffUser через staff_user на объекте User

Ваша ошибка исходит от экземпляра u.staffUser.department, вместо этого сделайте что-то вроде этого u.user.department:


def FileUploadForm(request, pk):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            form.save(commit=False)
            u = User.objects.get(username=request.user)
            form.instance.username = u
            folder = Folder.objects.get(id=pk)
            department = u.user.department
            form.save()
            messages.success(request, f'File Successfully uploaded to {folder} in {department}!')
            return redirect('home')
    else:
        form = UploadFileForm()

    context = {'pk':pk, 'form':form}
    return render(request, "pages/fileup_form.html", context)

Вы должны указать обратное в нижнем регистре, поэтому staffuser вместо staffUser.

В качестве альтернативы вы можете указать связанное имя, которое будет использоваться для вызова обратного аксессора, как показано ниже, вместо some_name.

user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=some_name)

Вернуться на верх