【问题标题】:Save Button Not Working with Attribute Error: 'WSGIRequest' object has no attribute 'project'保存按钮不适用于属性错误:“WSGIRequest”对象没有属性“项目”
【发布时间】:2021-06-20 03:05:14
【问题描述】:

我检查了这里的其他帖子,这些帖子有我的属性错误,但它们似乎是出于不同的原因。我目前正在从表单中请求用户更新项目页面的信息。然后,如果表单有效,我将保存表单,保存项目,然后尝试将重定向返回到项目页面;但是,当我单击按钮时,计算机会呈现错误页面。我将附上我的 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)

ProjectUpdateForm 的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"),

谢谢,请告诉我我能做什么。

【问题讨论】:

    标签: python django button save


    【解决方案1】:

    您的错误在request.project.save() 行,请求没有项目属性。

    实际上您不需要为项目调用save() 方法。

    因为ProjectUpdateFormModelFormModelForm.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 需要名称属性:

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

    【讨论】:

    • 当我删除 request.project.save() 时,我得到NoReverseMatch at /editproject/save-world/ Reverse for 'project' with no arguments not found. 1 pattern(s) tried: ['project/(?P&lt;name&gt;[^/]+)/$'] 这就是我尝试请求项目并保存它的原因。我应该如何解决这个问题?
    • @AndrewBregman,我编辑了我的答案,你必须提供论据name:redirect('project', name=instance.name)
    猜你喜欢
    • 1970-01-01
    • 2016-07-30
    • 2017-02-02
    • 2015-04-15
    • 2013-05-20
    • 2016-09-22
    • 2015-10-19
    • 2021-11-16
    • 2012-07-31
    相关资源
    最近更新 更多