Кнопка сохранить Не работает с ошибкой атрибута: объект «WSGIRequest» не имеет атрибута «проект»

#python #django #button #save

Вопрос:

Я проверил другие сообщения здесь, в которых есть ошибка атрибута, которая у меня есть, но они, похоже, по другим причинам. В настоящее время я запрашиваю информацию из формы для пользователей, чтобы обновить страницу проекта. Затем, если форма действительна, я сохраняю форму, сохраняю проект, затем пытаюсь вернуть перенаправление на страницу проекта; однако, когда я нажимаю кнопку, компьютер отображает страницу с ошибкой. Я прикреплю свой forms.py, views.py, models.py, и urls.py:

Views.py для раздела обновления:

   @wraps(function)
  def wrap(request, *args, **kwargs):
        user = request.user
        name = kwargs.get('name')  
        if uProjects.objects.filter(project=Project.objects.get(name=name), user=user, ifAdmin=True).exists():
             return function(request, *args, **kwargs)
        else:
            return HttpResponseRedirect('/')
  return wrap

@admin_check
def update(request, name):
    project = Project.objects.get(name = name)
    if request.method == "POST":
        pr_form = ProjectUpdateForm(request.POST,
                                    request.FILES,
                                    instance=project)
    #if is_admin in Member == True: #need to authenticate user, access user permissions, if user has permission:
        if pr_form.is_valid():
            pr_form.save()
            messages.success(request, f'This project has been updated.')
           
            request.project.save()
            return redirect('project')
        
    else:
        pr_form = ProjectUpdateForm(instance=project)
    context = {
        'pr_form': pr_form
    }
    return render(request, 'projects/updateproject.html', context)
 

forms.py для проектной формы:

 class ProjectUpdateForm(forms.ModelForm):
    class Meta:
        model = Project
        fields=['name', 'department', 'department','bPic', 'logo',
        'department', 'purpose', 'projectTag', 'lookingFor', 'recruiting']
 

urls.py

 from projects import views as p

path('project/<str:name>/', p.project, name='project'),
path('editproject/<str:name>/', p.update, name="editproject"),

 

Спасибо, пожалуйста, дайте мне знать, что я могу сделать.

Ответ №1:

Ваша ошибка в строке request.project.save() , запрос не имеет атрибута проекта.

И на самом деле вам не нужно вызывать save() метод для проекта.

Потому ProjectUpdateForm ModelForm что метод and ModelForm.save() (Django docs) создаст новый экземпляр указанной модели или обновит назначенный экземпляр.

 
@admin_check
def update(request, name):
    project = Project.objects.get(name = name)
    if request.method == "POST":
        pr_form = ProjectUpdateForm(request.POST,
                                    request.FILES,
                                    instance=project)
    #if is_admin in Member == True: #need to authenticate user, access user permissions, if user has permission:
        if pr_form.is_valid():
            # save() returns an instance object, you can use it to manipulate your object.
            instance = pr_form.save() 
            messages.success(request, f'This project has been updated.')
            # YOUR ERROR IS ⬇️ HERE request doesn't have project attribute
            # request.project.save()
            # redirect with arguments
            return redirect('project', name=instance.name)
    ...
 

Также ваш редирект должен содержать аргумент name , поскольку URL-адрес вашего проекта требует атрибута name:

 redirect('project', name=instance.name)
 

Комментарии:

1. когда я удаляю request.project.save(), я понимаю NoReverseMatch at /editproject/save-world/ Reverse for 'project' with no arguments not found. 1 pattern(s) tried: ['project/(?P<name>[^/] )/$'] , почему я пытался запросить проект и сохранить его. Как мне с этим бороться?

2. @AndrewBregman, я отредактировал свой ответ, вы должны предоставить аргумент name : redirect('project', name=instance.name)