توی یک فرم یک فیلد داریم بنام full_name که بر اساس first_name و last_name توی view باید ساخته بشه. برای اینکه بشه توی فرم و view ازش استفاده کرد توی fields مربوط به فرم اونو آوردیم.
چون این فیلد اتوماتیک ساخته میشه نمیخایم توی وب نشون داده بشه بنابراین expert_form.fields['full_name'].widget = forms.HiddenInput()
ولی مشکل اینجاست که قبل از اینکه فرم post بشه ارور میگیریم که این فیلد باید پر بشه از طرفی Hidden هست.
راه حل این شد که باید توی __init__ فرم این رو از حالت required خارج کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
def expert_add(request): if request.method == "POST": expert_form = ExpertForm(request.POST) else: expert_form = ExpertForm() expert_form.fields['prefix'].widget = forms.HiddenInput() expert_form.fields['sur_name'].widget = forms.HiddenInput() expert_form.fields['full_name'].widget = forms.HiddenInput() if request.method == "POST": if expert_form.is_valid(): expert_instance = expert_form.save(commit=False) if expert_form.cleaned_data['is_male']: expert_instance.prefix = "آقای" else: expert_instance.prefix = "خانم" expert_instance.full_name = expert_form.cleaned_data['first_name'] + " " + expert_form.cleaned_data['last_name'] expert_instance.save() messages.success(request, "...") return redirect('/man/expert/') return render(request, "man/expert/expert-add.html", {"form": expert_form}) class ExpertForm(ModelForm): class Meta: model = Expert fields = ["sur_name", "full_name", "prefix", "first_name", "last_name", "branch", "office", "is_male"] def clean_branch(self): if not self.cleaned_data["branch"]: raise ValidationError("این فیلد اجباری است.") return self.cleaned_data["branch"] def clean_office(self): if not self.cleaned_data["office"]: raise ValidationError("این فیلد اجباری است") return self.cleaned_data["office"] def clean_first_name(self): if not self.cleaned_data["first_name"]: raise ValidationError("این فیلد اجباری است") return self.cleaned_data["first_name"] def clean_last_name(self): if not self.cleaned_data["last_name"]: raise ValidationError("این فیلد اجباری است") return self.cleaned_data["last_name"] def clean(self): cleaned_data = super().clean() if cleaned_data.get("office") and cleaned_data.get("branch"): if cleaned_data.get("office").branch != cleaned_data.get("branch"): raise ValidationError("ا...") return cleaned_data def __init__(self, *args, **kwargs): super(ExpertForm, self).__init__(*args, **kwargs) self.fields['full_name'].required = False |