【问题标题】:'ModelFormOptions' object has no attribute 'concrete_fields' in Django“ModelFormOptions”对象在 Django 中没有属性“concrete_fields”
【发布时间】:2020-07-08 03:28:22
【问题描述】:

我正在更新我的模型,但它显示了这个错误:

“ModelFormOptions”对象没有“concrete_fields”属性

我做错了什么?

views.py


class EditProduct(TemplateView):
    template_name = 'stock/editproduct.html'

    def get(self, request, product_id):
        productedit = get_object_or_404(Product, pk=product_id)
        data=Product.objects.get(id=product_id)
        form = EditProductForm(instance=data)
        args = {'form':form, 'productedit':productedit}
        return render(request, self.template_name, args)

    def post(self, request, product_id):
        data = Product.objects.get(id=product_id)
        form = EditProductForm(instance=data)
        form = EditProductForm(request.POST, request.FILES, instance=form)
        if form.is_valid():
            productadded = form.save(commit=False)
            productadded.saler =  request.user
            productadded.pub_date = timezone.datetime.now()
            productadded.save()
            return redirect('stock')
        else:
            args = {'form': form}
            return render(request, self.template_name, args)

追溯

 File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\Adil Ijaz\Desktop\onlineProject\market\stock\views.py", line 109, in post
    form = EditProductForm(request.POST, request.FILES, instance=form)
  File "C:\Users\Adil Ijaz\Desktop\onlineProject\market\stock\forms.py", line 39, in __init__
    super(EditProductForm, self).__init__(*args, **kwargs)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\models.py", line 293, in __init__
    object_data = model_to_dict(instance, opts.fields, opts.exclude)
  File "C:\Users\Adil Ijaz\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\forms\models.py", line 86, in model_to_dict
    for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
AttributeError: 'ModelFormOptions' object has no attribute 'concrete_fields'

【问题讨论】:

    标签: python django python-3.x forms model


    【解决方案1】:

    instance 应该EditProductForminstance

    class EditProduct(TemplateView):
        template_name = 'stock/editproduct.html'
    
        # …
    
        def post(self, request, product_id):
            data = Product.objects.get(id=product_id)
            form = EditProductForm(request.POST, request.FILES, instance=data)
            if form.is_valid():
                productadded = form.save(commit=False)
                productadded.saler =  request.user
                productadded.pub_date = timezone.datetime.now()
                productadded.save()
                return redirect('stock')
            else:
                args = {'form': form}
                return render(request, self.template_name, args)

    话虽如此,在这里使用UpdateView [Django-doc] 并删除大量样板代码可能会更好:

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.urls import reverse
    from django.views.generic.edit import UpdateView
    
    class EditProduct(LoginRequiredMixin, UpdateView):
        template_name = 'stock/editproduct.html'
        model = Product
        pk_url_kwarg = 'product_id'
        form_class = EditProductForm
        success_url = reverse_lazy('stock')
    
        def form_valid(self, form):
            form.instance.saler = request.user
            form.instance.pub_date = timezone.datetime.now()
            super().form_valid(form)

    注意:您可以将视图限制为基于类的视图,以便通过身份验证的用户使用 LoginRequiredMixin mixin [Django-doc].

    【讨论】:

    • 谢谢。在第二种方法 UpdateView 中,我将代码粘贴到我的项目中,但我遇到了这个错误:EditProduct 缺少 QuerySet。定义 EditProduct.model、EditProduct.queryset,或覆盖 EditProduct.get_queryset()。
    • @AdilIjaz:啊对,需要指定型号,所以model = Product
    • @AdilIjaz:我编辑了答案以添加这一行:)
    • @WillemVanOnsem - 你能抽出一些时间检查一下this吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 2020-02-11
    • 2015-02-19
    • 2016-03-30
    • 2021-04-05
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多