복붙노트

[PYTHON] 어떻게 장고 양식에서 모델 필드를 비활성화 할 수 있습니까?

PYTHON

어떻게 장고 양식에서 모델 필드를 비활성화 할 수 있습니까?

나는 이런 모델을 가지고있다 :

class MyModel(models.Model):
    REGULAR = 1
    PREMIUM = 2
    STATUS_CHOICES = ((REGULAR, "regular"), (PREMIUM, "premium"))
    name = models.CharField(max_length=30)
    status = models.IntegerField(choices = STATUS_CHOICES, default = REGULAR)

class MyForm(forms.ModelForm):
    class Meta:
        model = models.MyModel

보기에서 한 필드를 초기화하고 편집 할 수 없게하려고합니다.

myform = MyForm(initial = {'status': requested_status})
myform.fields['status'].editable = False

그러나 사용자는 여전히 해당 필드를 변경할 수 있습니다.

내가 한 일을 성취하는 진정한 방법은 무엇입니까?

해결법

  1. ==============================

    1.1 단계 : 프론트 엔드 위젯 사용 중지

    1 단계 : 프론트 엔드 위젯 사용 중지

    HTML readonly 속성을 사용하십시오. http://www.w3schools.com/tags/att_input_readonly.asp

    또는 사용 중지 된 속성 : http://www.w3.org/TR/html401/interact/forms.html#adef-disabled

    위젯 attrs 속성을 통해 임의의 HTML 키 값 쌍을 삽입 할 수 있습니다.

    myform.fields['status'].widget.attrs['readonly'] = True # text input
    myform.fields['status'].widget.attrs['disabled'] = True # radio / checkbox
    

    2 단계 : 백엔드에서 필드가 효과적으로 비활성화되었는지 확인합니다.

    POST 입력에 관계없이 (누군가가 POST를 가짜로 만들거나 원시 HTML을 편집 할 수 있습니다.) 이미 존재하는 필드 값을 가져올 수 있도록 필드에 대한 메소드를 재정의하십시오.

    def clean_status(self):
        # when field is cleaned, we always return the existing model field.
        return self.instance.status
    
  2. ==============================

    2.제외 기능을 사용해 보셨습니까?

    제외 기능을 사용해 보셨습니까?

    이 같은

    class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title')
    
    class PartialAuthorForm(ModelForm):
    class Meta:
        model = Author
        exclude = ('birth_date',)
    

    여기 참조

  3. ==============================

    3.상태 필드에 대한 위젯 인스턴스를 사용자 정의하면됩니다.

    상태 필드에 대한 위젯 인스턴스를 사용자 정의하면됩니다.

    class MyModel(models.Model):
        REGULAR = 1
        PREMIUM = 2
        STATUS_CHOICES = ((REGULAR, "regular"), (PREMIUM, "premium"))
        name = models.CharField(max_length=30)
        status = models.IntegerField(choices = STATUS_CHOICES, default = REGULAR)
    
    class MyForm(forms.ModelForm):
        status =  forms.CharField(widget=forms.TextInput(attrs={'readonly':'True'}))
    
        class Meta:
            model = models.MyModel
    

    참조 : Django 문서

  4. ==============================

    4.장고 1.9에서 :

    장고 1.9에서 :

    from django.forms import Textarea
    
    class MyModelForm(forms.ModelForm):
        class Meta:
            model = MyModel
            fields = '__all__'
            widgets = {'my_field_in_my_model': Textarea(attrs={'cols':80,'rows':1}),}             
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['my_field_in_my_model'].disabled = True
    
  5. ==============================

    5.그것을하는 아주 쉬운 방법이있다 :

    그것을하는 아주 쉬운 방법이있다 :

    class GenerateCertificate(models.Model):
    
        field_name = models.CharField(
            max_length=15,
            editable=False)
        def __unicode__(self):
            return unicode(self.field_name)
    

    editable = False는 필드를 편집 할 수 없게 만듭니다.

  6. from https://stackoverflow.com/questions/4945802/how-can-i-disable-a-model-field-in-a-django-form by cc-by-sa and MIT license