“ModelFormOptions”对象在Django中没有属性“concrete\u fields”

2024-09-30 01:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在更新模型,但它显示了以下错误:

'ModelFormOptions' object has no attribute 'concrete_fields'

我犯了什么错误

视图.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'

Tags: inpyformrequestliblocallineargs
1条回答
网友
1楼 · 发布于 2024-09-30 01:18:29

instance应该而不是EditProductForm,而instance

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)

尽管如此,在这里使用^{} [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)

Note: You can limit views to a class-based view to authenticated users with the LoginRequiredMixin mixin [Django-doc].

相关问题 更多 >

    热门问题