django - 通过modelformset更新时分配错误之前引用的Django局部变量
问题描述
我有这个视图来编辑 3 个 ModelForms(2 个通过 ModelFormSet):
@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, instance=instance_dossier)
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()
#messages.success(request, "Dossier révisé!")
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})
这是我的forms.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')
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')
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',)
当我运行视图时,我发现了这个错误:
Exception Type: UnboundLocalError
Exception Value: local variable 'dossier_form' referenced before assignment
这是场景:我想在同一个视图/模板中编辑 3 个表单。我为创建新模型创建了一个类似的视图,它工作得很好(非常相似的视图,只是这次我添加了现有模型的 pk 进行修改,并在 GET 方法场景中添加它)。似乎是什么问题?
解决方案
推荐阅读
- elixir - 捕获 [错误] GenServer #PID<0.1278.0> 终止
- c# - 覆盖空属性的 C# 属性
- windows - 有没有办法在 windows cmd 中的 cd 更改后自动显示目录的内容?
- sql - 从 case 语句中的不同表进行比较
- javascript - 一些特殊字符在以 JSON 格式保存时转换为“_”,PHP
- javascript - 如果项目不在用于按钮单击的数组中,则将 1 项添加到数组
- python - 该应用程序不显示 file.html 中的图片 - Django、Python
- prolog - Prolog计数频率
- angular - 未捕获的错误:模块“AppRoutingModule”声明的意外模块“RouterModule”。请添加@Pipe/@Directive/@Component 注解
- regex - 构建在字符串中分隔文件名的正则表达式