standard MFV Pattern - pai-plznw4me/django-initializer GitHub Wiki

MFV(Model Form View) PAI ν‘œμ€€ κ°€μ΄λ“œ

⚠️ μž‘μ„±μ€‘, μ‹€μ œ 적용 κΈˆμ§€

Model

λͺ¨λΈμ„ μ§€μ •ν• λ•ŒλŠ” verbose 이름을 μ§€μ •ν•˜μž standard_index table 을 μƒμ„±ν•˜κ±°λ‚˜ standard_detail μ—μ„œ ν•­λͺ©μ„ ν‘œκΈ°ν• λ•Œ μ‚¬μš©λœλ‹€.

class Approval(models.Model):
    requester = models.ForeignKey(to=CustomUser, on_delete=models.SET_NULL, null=True, verbose_name='μš”μ²­μž')
    name = models.CharField(max_length=100, verbose_name='제λͺ©')
    desc = models.TextField(verbose_name='μ„€λͺ…')
    request_datetime = models.DateTimeField(verbose_name='μš”μ²­ μ‹œκ°„')
    approval_date = models.DateField('승인 μ‹œκ°„')
    CHOICES = [('REQ', 'REQUEST'), ('UDR', 'Under review'), ('EUR', 'Emergency under Review'), ('CPL', 'COMPLETE')]
    status = models.CharField(max_length=3, choices=CHOICES, default='UDR', verbose_name='승인 μƒνƒœ')

    class Meta:
        permissions = [('can_approval',  # 기둝될 κΆŒν•œ 이름
                        'Can approval')]  # μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§ˆ κΆŒν•œ 이름

λͺ¨λΈ μž‘μ„± μ‹œ κ·œμΉ™

  1. verbose_name 을 λͺ¨λ‘ μ§€μ •ν•œλ‹€.
  2. field 의 μˆœμ„œλŠ” c, r, u, d μ—μ„œ μ‹€μ œ λ³΄μ—¬μ§ˆ ν•„λ“œμ˜ κΈ°λ³Έ μˆœμ„œμ΄λ‹€. (λ¬Όλ‘  μΆ”κ°€μ μœΌλ‘œ λ³€κ²½ν• μˆ˜ μžˆλ‹€.)
  3. choice 의 μˆœμ„œλ„ μ‚¬μš©λœλ‹€. form μ—μ„œ μ•„λž˜μ™€ 같이 μ‚¬μš©λ μˆ˜ 있기 λ•Œλ¬Έμ— μˆœμ„œλ„ 잘 μž‘μ„±ν•΄ λ‘μž
 def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # μƒμ„±μ‹œμ— field 을 2개둜 μ œν•œν•¨. ('REQ', 'REQUEST'), ('EUR', 'Emergency under Review')
        self.fields['status'].choices = Approval.CHOICES[:2] #<-- 

Form

  1. HTML 에 λ³΄μ—¬μ§€λŠ” 폼 μ •λ³΄λŠ” Form class μ—μ„œ κ΄€λ¦¬ν•œλ‹€.

  2. μž…λ ₯된 폼 정보λ₯Ό μ²˜λ¦¬ν•˜λŠ”κ²ƒλ„ Form class μ—μ„œ κ΄€λ¦¬ν•œλ‹€. (μœ νš¨μ„± 검사, λ“±)

  3. μž…λ ₯된 폼 정보λ₯Ό μ €μž₯ν•˜λŠ”κ²ƒλ„ Form class μ—μ„œ κ΄€λ¦¬ν•œλ‹€.

  4. 폼 정보λ₯Ό λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ—μ„œ μ²˜λ¦¬ν•˜λŠ”κ²ƒλ“€μ€ View μ—μ„œ μ²˜λ¦¬ν•œλ‹€. λΉ„μ§€λ‹ˆμŠ€ 둜직 μ „μ—λŠ” νΌμ—μ„œ μ²˜λ¦¬ν•œλ‹€.

class ApprovalUpdateForm(forms.ModelForm):
    class Meta:
        model = Approval
        fields, verbose_names, types = get_all_field_info(model, with_id=False)
        field_names = verbose_names
        widgets = apply_widget_by_field(model,
                                        fields,
                                        DateTime=forms.widgets.DateInput(attrs={'type': 'datetime-local'}),
                                        Date=forms.widgets.DateInput(attrs={'type': 'date'}))
        widgets['requester'] = forms.widgets.DateInput(attrs={'readonly': 'readonly'})

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # μƒμ„±μ‹œμ— field 을 2개둜 μ œν•œν•¨. ('REQ', 'REQUEST'), ('EUR', 'Emergency under Review')
        self.fields['status'].choices = Approval.CHOICES[:2]