首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用视图中的表单集更新3个表单

使用视图中的表单集更新3个表单
EN

Stack Overflow用户
提问于 2019-12-20 07:07:44
回答 1查看 103关注 0票数 0

我有一个使用3个ModelForms和表单集添加3个不同模型对象的视图:如下所示:

代码语言:javascript
复制
@login_required
def nouveaudossier(request):
    DocumentFormSet = modelformset_factory(DocumentdeBase, form=DocumentdebaseForm, extra=5)
    PhotoAvantFormSet = modelformset_factory(PhotoAvant, form=PhotoAvantForm, extra=5)
    if request.method == 'POST':
        dossierForm = DossierForm(request.POST)
        formset = DocumentFormSet(request.POST, request.FILES, queryset=DocumentdeBase.objects.none())
        formset2 = PhotoAvantFormSet(request.POST, request.FILES, queryset=PhotoAvant.objects.none())
        if dossierForm.is_valid() and formset.is_valid() and formset2.is_valid():
            dossier_form = dossierForm.save(commit=False)
            dossier_form.created_by = Prestataire.objects.filter(user=request.user).first()
            dossier_form.save()
            for form in formset.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form:
                    image = form['documentdebase_image']
                    photo = DocumentdeBase(dossier=dossier_form, documentdebase_image=image)
                    photo.save()
            for form2 in formset2.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form2:
                    image2 = form2['photoavant_image']
                    photo2 = PhotoAvant(dossier=dossier_form, photoavant_image=image2)
                    photo2.save()
            messages.success(request,
                             "Dossier créé!")
            return HttpResponseRedirect("/")
        else:
            print(dossierForm.errors, formset.errors, formset2.errors)
    else:
        dossierForm = DossierForm()
        formset = DocumentFormSet(queryset=DocumentdeBase.objects.none())
        formset2 = PhotoAvantFormSet(queryset=PhotoAvant.objects.none())
    return render(request, 'dashboard/nouveau_dossier.html',
                  {'dossierForm': dossierForm, 'formset': formset, 'formset2': formset2})

现在,我想创建一个更新视图,其中它采用相同的形式,并用来自3个模型的现有数据填充它,用户可以进行更改。下面是我所做的,我向表单添加了一个实例,并向函数添加了一个pk属性:

代码语言:javascript
复制
@login_required
def reviserdossier(request, pk):
    DocumentFormSet = modelformset_factory(DocumentdeBase, form=DocumentdebaseForm, extra=5)
    PhotoAvantFormSet = modelformset_factory(PhotoAvant, form=PhotoAvantForm, extra=5)
    if request.method == 'POST':
        instance_dossier = Dossier.objects.get(pk=pk)
        dossierForm = DossierForm(request.POST, instance=instance_dossier)
        instance_document = DocumentdeBase.objects.get(pk=pk)
        formset = DocumentFormSet(request.POST, request.FILES or None, instance=instance_document)
        instance_photo = PhotoAvant.objects.get(pk=pk)
        formset2 = PhotoAvantFormSet(request.POST, request.FILES or None, instance=instance_photo)
        if dossierForm.is_valid() and formset.is_valid() and formset2.is_valid():
            dossier_form = dossierForm.save(commit=False)
            dossier_form.created_by = Prestataire.objects.filter(user=request.user).first()
            dossier_form.save()
            for form in formset.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form:
                    image = form['documentdebase_image']
                    photo = DocumentdeBase(dossier=dossier_form, documentdebase_image=image)
                    photo.save()
            for form2 in formset2.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form2:
                    image2 = form2['photoavant_image']
                    photo2 = PhotoAvant(dossier=dossier_form, photoavant_image=image2)
                    photo2.save()
            messages.success(request, "Dossier mis à jour!")
            return HttpResponseRedirect("/")
        else:
            print(dossierForm.errors, formset.errors, formset2.errors)
    else:
        dossierForm = DossierForm()
        formset = DocumentFormSet(queryset=DocumentdeBase.objects.none())
        formset2 = PhotoAvantFormSet(queryset=PhotoAvant.objects.none())
    return render(request, 'dashboard/reviser_dossier.html',
                  {'dossierForm': dossierForm, 'formset': formset, 'formset2': formset2})

当我运行视图时,我得到这个错误:

代码语言:javascript
复制
Exception Type:     TypeError
Exception Value:    __init__() got an unexpected keyword argument 'instance'

这是我的回溯:

代码语言:javascript
复制
Environment:


Request Method: POST
Request URL: http://localhost:8000/dossiers/reviser/7

Django Version: 2.2.5
Python Version: 3.7.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'dashboard.apps.DashboardConfig',
 'crispy_forms',
 'photologue']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "C:\Users\Kaiss Bouali\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\Kaiss Bouali\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\Kaiss Bouali\AppData\Local\Programs\Python\Python37\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\Kaiss Bouali\AppData\Local\Programs\Python\Python37\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "D:\verautov0\verautonoapi\dashboard\views.py" in reviserdossier
  776.         formset = DocumentFormSet(request.POST, request.FILES or None, instance=instance_document)

File "C:\Users\Kaiss Bouali\AppData\Local\Programs\Python\Python37\lib\site-packages\django\forms\models.py" in __init__
  569.         super().__init__(**{'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix, **kwargs})

Exception Type: TypeError at /dossiers/reviser/7
Exception Value: __init__() got an unexpected keyword argument 'instance'

下面是我编写的新代码,仍然存在相同的问题:

代码语言:javascript
复制
@login_required
def reviserdossier(request, pk):
    DocumentFormSet = modelformset_factory(DocumentdeBase, form=DocumentdebaseForm, extra=5)
    PhotoAvantFormSet = modelformset_factory(PhotoAvant, form=PhotoAvantForm, extra=5)
    if request.method == 'POST':
        dossierForm = DossierForm(request.POST)
        formset = DocumentFormSet(request.POST, request.FILES, queryset=DocumentdeBase.objects.none())
        formset2 = PhotoAvantFormSet(request.POST, request.FILES, queryset=PhotoAvant.objects.none())
        if dossierForm.is_valid() and formset.is_valid() and formset2.is_valid():
            dossier_form = dossierForm.save(commit=False)
            dossier_form.created_by = Prestataire.objects.filter(user=request.user).first()
            dossier_form.save()
            for form in formset.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form:
                    image = form['documentdebase_image']
                    photo = DocumentdeBase(dossier=dossier_form, documentdebase_image=image)
                    photo.save()
            for form2 in formset2.cleaned_data:
                #this helps to not crash if the user   
                #do not upload all the photos
                if form2:
                    image2 = form2['photoavant_image']
                    photo2 = PhotoAvant(dossier=dossier_form, photoavant_image=image2)
                    photo2.save()
            messages.success(request, "Dossier mis à jour!")
            return HttpResponseRedirect("/")
        else:
            print(dossierForm.errors, formset.errors, formset2.errors)
    else:
        instance_dossier = Dossier.objects.get(pk=pk)
        dossierForm = DossierForm(request.POST, instance=instance_dossier)
        instance_document = DocumentdeBase.objects.get(pk=pk)
        formset = DocumentFormSet(request.POST, request.FILES or None, instance=instance_document)
        instance_photo = PhotoAvant.objects.get(pk=pk)
        formset2 = PhotoAvantFormSet(request.POST, request.FILES or None, instance=instance_photo)
    return render(request, 'dashboard/reviser_dossier.html',
                  {'dossierForm': dossierForm, 'formset': formset, 'formset2': formset2})
EN

回答 1

Stack Overflow用户

发布于 2019-12-20 18:42:44

尝试以这种方式在视图中处理表单:

代码语言:javascript
复制
if request.method == 'GET': # You first time load the update page
    dossier     = Dossier.objects.get(pk=pk)
    dossierForm = DossierForm(instance=dossier)
    ...

if request.method == 'POST':
    dossierForm = DossierForm(request.POST)
    ... # Validation, save...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59418001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档