python - 'QuerySet' 对象没有属性 '_meta'

标签 python django-views django-class-based-views

我正在使用 python django 框架开发一个简单的应用程序,我正在使用基于类的 View ,当我使用 UpdateView 并尝试运行我的模板时,我得到了这个错误;

'QuerySet' object has no attribute '_meta'

这是我的查看代码

class UpdateStaff(LoginRequiredMixin, UpdateView):
    template_name = 'app/update_staff.html'
    form_class = UpdateStaffForm
    model = Staff

    def get_object(self, queryset=None):
        obj = Staff.objects.filter(pk=self.kwargs['staff_id'])
        return obj

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST or None, 
                               instance=self.get_object())
        if form.is_valid():
            obj = form.save(commit=False)
            obj.save()
            messages.success(self.request, "Staff has been updated")
            return self.get_success_url()
        else:
            messages.error(self.request, "Staff not updated")
            return HttpResponseRedirect(reverse('update_staff'))

    def get_success_url(self):
        return HttpResponseRedirect(reverse('manage_staffs'))

    def get_context_data(self, **kwargs):
        context = super(UpdateStaff,         
                        self).get_context_data()
        context['messages'] = messages.get_messages(self.request)
        context['form'] = self.form_class(self.request.POST or None, 
                                          instance=self.get_object())
        return context

这是我的表单代码:

class UpdateStaffForm(ModelForm):

class Meta:
    model = Staff
    exclude = (
        'profile_picture', 'start_work', 'last_login', 'groups', 
        'user_permissions', 'is_active', 'is_superuser',
        'date_joined', 'end_work', 'can_sell_out_of_assigned_area', 
        'is_staff')

    def __init__(self, *args, **kwargs):
        super(UpdateStaffForm, self).__init__(*args, 
                                                     **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'

任何有想法解决这个问题的人请帮助。

最佳答案

get_object 方法返回 queryset 即记录列表,而不是 instance。要获取 instance,您可以在 filter() 上使用 first() 。这将使您第一次出现。

def get_object(self, queryset=None):
    obj = Staff.objects.filter(pk=self.kwargs['staff_id']).first()
    return obj

关于python - 'QuerySet' 对象没有属性 '_meta',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45856557/

相关文章:

Python:在基类的方法中初始化一个新的派生类

Python argparse 使用 switch 来运行 if 语句

python - 安装模块时无模块错误

python - 使 URL 接受可选参数。非捕获

Django,当我们有电子邮件而不是用户名时覆盖 "is_authenticated()"

django-models - Feincms 混合内容类型

python - 使用 django 表单获取请求公开数据

python - Pandas pivot_table 保留顺序

python - 连接httpresponse对象django

python - CreateView 中的多个表单和表单集