Django表单刷新而不更改!没有E

2024-05-16 00:00:08 发布

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

所以我有一个文件夹模型,还有两个通过ForeignKey与之相关的模型。我有这样一种方法,可以使用3个窗体创建3个单独的对象(创建文件夹对象,并将文件上载到与文件夹相关的2个单独模型):

@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})

视图运行得很好,下面是它的屏幕截图:enter image description here

现在我想做一个编辑表单,获取有问题的模型的id,填充表单,当然,让用户进行必要的更改。以下是我所做的:

@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 == 'GET':
        instance_dossier = Dossier.objects.get(pk=pk)
        dossierForm = DossierForm(instance=instance_dossier)
        instance_document = DocumentdeBase.objects.get(pk=pk)
        formset = DocumentFormSet(instance=instance_document)
        instance_photo = PhotoAvant.objects.get(pk=pk)
        formset2 = PhotoAvantFormSet(instance=instance_photo)

    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)
    return render(request, 'dashboard/reviser_dossier.html',
                  {'dossierForm': dossierForm, 'formset': formset, 'formset2': formset2})

当我运行这个时,我得到了这个错误:__init__() got an unexpected keyword argument 'instance'

这是我在许多教程中发现的,使用instance关键字。我是不是漏了什么? 谢谢你

这是我的回溯:

Environment:


Request Method: GET
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
  777.         formset = DocumentFormSet(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'

表单.py:

class DossierForm(forms.ModelForm):
    mat_id = forms.CharField(max_length=7, label="N°")
    mattypes = (
        ('A - أ', 'A - أ'),
        ('B - ب', 'B - ب'),
        ('D - د', 'D - د'),
        ('H - ه', 'H - ه'),
        ('O - و', 'O - و'),
        ('M - المغرب', 'M - المغرب'),
        ('P - ش', 'P - ش'),
        ('J - ج', 'J - ج'),
        ('FAR - ق م م', 'FAR - ق م م'),
        ('FA - ق س', 'FA - ق س'),
        ('PC - و م', 'PC - و م'),
        ('CD - ه د', 'CD - ه د'),
        ('CI - ت د', 'CI - ت د'),
        ('CC - ت د', 'CC - ت د'),
        ('WW', 'WW'),
        ('W18', 'W18'),
        ('96', '96'),
        ('97', '97'),
        ('98', '98'),
        ('99', '99'),
    )
    mat_symbol = forms.CharField(label='Symbole', widget=forms.Select(choices=mattypes))
    mat_ville = forms.CharField(max_length=2, label='Ville')
    assurance = forms.ModelChoiceField(queryset=Assurance.objects.all())
    ville = forms.ModelChoiceField(queryset=City.objects.all())
    intermediaire = forms.ModelChoiceField(queryset=Intermediaire.objects.all())
    marque = forms.ModelChoiceField(queryset=Marque.objects.all())
    model = forms.ModelChoiceField(queryset=Model.objects.all())
    client_name = forms.CharField(max_length=70)
    num_police = forms.IntegerField()
    glace_type = forms.ModelChoiceField(queryset=GlassType.objects.all())
    glace = forms.ModelChoiceField(queryset=Glass.objects.all())
    joint = forms.BooleanField(initial=False, required=False)
    OV = ( # Options Vitre
        ('AD', 'AD'),
        ('SD', 'SD'),
        ('T', 'T'),
        ('ST', 'ST'),
    )

    option_vitre = forms.CharField(label='Option vitre', widget=forms.Select(choices=OV))
    valeur_assuree = forms.IntegerField(label='Valeur assurée')
    num_sinistre = forms.IntegerField(label='N° sinistre')
    date_sinistre = forms.DateField(widget=forms.SelectDateWidget(months=MONTHS), label='Date sinistre')
    date_effet = forms.DateField(widget=forms.SelectDateWidget(months=MONTHS), label='Date effet')
    date_echeance = forms.DateField(widget=forms.SelectDateWidget(months=MONTHS), label='Date échéance')
    franchise_contractuelle = forms.IntegerField(label='Franchise contractuelle')
    franchise_a_recuperer = forms.IntegerField(label='Franchise à récupérer')
    tva_a_recuperer = forms.IntegerField(label='TVA à récupérer')
    commentaire = forms.CharField(widget=forms.Textarea, label='Commentaire')
    rejection_count = models.IntegerField()

    class Meta:
        model = Dossier
        fields = ('mat_id', 'mat_symbol', 'mat_ville', 'assurance', 'ville',
        'intermediaire', 'marque', 'model', 'client_name', 'num_police',
        'glace_type', 'glace', 'joint', 'option_vitre', 'valeur_assuree',
        'num_sinistre', 'date_sinistre', 'date_effet', 'date_echeance',
        'franchise_contractuelle', 'franchise_a_recuperer', 'tva_a_recuperer',
        'commentaire', 'rejection_count')

class DocumentdebaseForm(forms.ModelForm):
    documentdebase_image = forms.ImageField(label='')

    class Meta:
        model = DocumentdeBase
        fields = ('documentdebase_image',)

class PhotoAvantForm(forms.ModelForm):
    photoavant_image = forms.ImageField(label='')

    class Meta:
        model = PhotoAvant
        fields = ('photoavant_image',)

编辑: 以下是更新后的视图:

@login_required
def reviserdossier(request, pk):
    DocumentFormSet = modelformset_factory(DocumentdeBase, form=DocumentdebaseForm, extra=5)
    PhotoAvantFormSet = modelformset_factory(PhotoAvant, form=PhotoAvantForm, extra=5)
    instance_dossier = Dossier.objects.get(pk=pk)
    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():
            if instance_dossier.rejection_count == 1:
                dossier_form = dossierForm.save(commit=False)
                dossier_form.status_admin = 'Validation OR Requise'
                dossier_form.status_prestataire = "En Attente d'ordre de réparation"
                dossier_form.rejection_count = 0
                dossier_form.save()
            elif instance_dossier.rejection_count == 2:
                dossier_form = dossierForm.save(commit=False)
                dossier_form.status_admin = 'Dossier à clôturer'
                dossier_form.status_prestataire = "En attente de clôture"
                dossier_form.rejection_count = 0
                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()

            return HttpResponseRedirect("/")
        else:
            print(dossierForm.errors, formset.errors, formset2.errors)
    else:
        dossierForm = DossierForm(instance=instance_dossier)
        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, 'dossier': instance_dossier})

Tags: djangoinstanceimageformifobjectsrequestsave