آیا اینکه کد زیر به درستی کار میکنه کافیه؟
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 |
def office(request, office_id): off = Office.objects.get(pk=office_id) boss = None try: boss = off.boss except: pass context = { 'id': office_id, 'form': OfficeForm(model_to_dict(off), None), 'boss': boss, 'form2': OfficeBossForm(None, None) } if request.method == "GET": return render(request, "man/office/office.html", context) elif request.method == "POST": name = request.POST.get("name", None) if name: off.name = name title_en = request.POST.get("title_en", None) if title_en: off.title_en = title_en title_fa = request.POST.get("title_fa", None) if title_fa: off.title_fa = title_fa branch = request.POST.get("branch", None) if branch: off.branch_id = branch off.save() expert = request.POST.get("expert", None) if expert: try: if boss: boss.expert_id = expert boss.save() else: OfficeBoss.objects.create(office_id=office_id, expert_id=expert) except: messages.error(request, '....', extra_tags='danger') messages.info(request, json.dumps({ 'office_id': f'office_{office_id}', })) return redirect('/man/office/') else: if boss: boss.delete() messages.info(request, json.dumps({ 'office_id': f'office_{office_id}', })) return redirect('/man/office/') |
تابع بالا به درستی کار میکنه اما با تابع زیر جایگزینش کردم:
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 |
def office(request, office_id): office_obj = Office.objects.get(pk=office_id) office_boss_obj, _ = OfficeBoss.objects.get_or_create(office=office_obj) if request.method == "POST": office_form = OfficeForm(request.POST, instance=office_obj) office_boss_form = OfficeBossForm(request.POST, instance=office_boss_obj) else: office_form = OfficeForm(instance=office_obj) office_boss_form = OfficeBossForm(instance=office_boss_obj) if request.method == "POST": if office_form.is_valid() and office_boss_form.is_valid(): office_instance = office_form.save(commit=False) office_boss_instance = office_boss_form.save(commit=False) office_boss_instance.office = office_instance office_instance.save() office_boss_instance.save() messages.add_message(request, messages.SUCCESS, '....') return redirect('/man/office/') return render(request, "man/office/office.html", { 'form': office_form, 'form2': office_boss_form }) |
توی کد اول از دو فرم استفاده شده اما صرفا جهت رندر شدن توی HTML و از هیچ کدوم از قابلیت های دیگه فرم استفاده نشده. توی فرم هر صحت دیتای هر فیلد بر اساس دیتابیس بررسی میشه و صحت سنجی میشه. هر ارور مرتبطی با کل فرم یا هر کدوم از فیلدها در صورت وجود به کاربر نشون داده میشه. تمامی validation های لازم بعد از صدا زدن تابع is_valid انجام میشه. تمامی این موارد توی کد اول انجام نشده و در کل از فرم جنگو اصلا استفاده نشده. بخاطر همین کد دوم قابل اعتمادتره و قطعا باگهای کمتری دیده خواهد داشت. از طرفی واقعا کد دوم خواناتر و زیباتر هست.