Django 양식 필드를 숨겨진 필드로 변경


128

RegexField일반 텍스트 입력 필드와 매우 유사한 Django 양식이 있습니다.

내 견해로는 특정 조건에서 사용자에게 숨기고 가능한 한 양식을 비슷하게 유지하려고합니다. 이 필드를 필드로 바꾸는 가장 좋은 방법은 무엇입니까 HiddenInput?

필드에서 속성을 설정할 수 있다는 것을 알고 있습니다.

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

그리고 원하는 초기 값을 다음과 같이 설정할 수 있습니다.

form.initial['fieldname'] = 'mydesiredvalue'

그러나 위젯의 형태는 바뀌지 않습니다.

이 필드를 <input type="hidden">필드 로 만드는 가장 좋은 방법은 무엇입니까?

답변:


169

사용자 정의 템플리트 및보기가있는 경우 필드를 제외 {{ modelform.instance.field }}하고 값을 얻는 데 사용할 수 있습니다.

또한보기에서 사용하는 것이 좋습니다.

form.fields['field_name'].widget = forms.HiddenInput()

그러나 그것이 포스트의 저장 방법을 보호할지는 확실하지 않습니다.

도움이 되길 바랍니다.


1
&quot;&quot; is not a valid value for a primary key.이 솔루션을 사용한 후 is_valid 메소드에서 a 로 끝납니다 .
Jens Timmerman 2016 년

이상하게 들린다. 다른 것과 관련이 있다고 생각합니다. 생성하는 객체의 기본 키를 HiddenInput으로 표시합니까? 그렇다면,해서는 안됩니다.
christophe31

어쩌면 이것은 말할 필요도 없지만 이것이 작동하려면 양식을 가져와야합니다. from django import forms
teewuane

2
1.7에서이 구문을 사용하십시오. hidden_field_name = forms.CharField(label='reset', max_length=256, widget=forms.HiddenInput())여기서 키는 최신 위젯 구문입니다. 필요에 따라 조정하십시오.
Marc

196

이것은 또한 유용 할 수 있습니다 : {{ form.field.as_hidden }}


3
이것이 IMHO의 가장 좋은 답변입니다. 나는 항상 "제어기"파이썬 코드를 사용하여 양식 필드의 표시를 싫어했습니다.
trpt4him 2016 년

나는 종종 crispyforms로 일반 양식 템플릿을 만듭니다. crispyforms를 사용하거나 양식 클래스에서 양식 구조를 원하기 때문에 간단한 forloop에 필드를 표시하는 경우 양식에서 재정의하는 위젯이이를 수행하는 좋은 방법입니다. Bu 템플릿으로 폼 렌더링을 관리하면 실제로이 솔루션은 훨씬 명확합니다.
christophe31 년

이것은 당신이 미리 현장에 적용한 모든 수업을 지우는 것 같습니다 ...
John Aaron

59

나를 위해 일한 옵션은 원래 형식으로 필드를 다음과 같이 정의하십시오.

forms.CharField(widget = forms.HiddenInput(), required = False)

그런 다음 새 클래스에서 클래스를 재정의하면 해당 클래스가 그대로 유지됩니다.


45

첫째, 사용자가 데이터를 수정하지 못하게하려면 필드를 제외하는 것이 더 깔끔해 보입니다. 숨겨진 필드로 포함하면 유선으로 전송할 데이터가 더 많아지고 원하지 않는 경우 악의적 인 사용자가 데이터를 수정하도록 초대합니다. 필드를 포함해야하지만 숨길만한 충분한 이유가있는 경우 모델 인수의 생성자에 키워드 인수를 전달할 수 있습니다. 아마도 이런 것 :

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

그렇다면 당신의 관점에서 :

form = MyModelForm(hide_condition=True)

뷰에서 모델 형식의 내부를 수정하는 것이이 접근법을 선호하지만 맛의 문제입니다.


11
kwargs [ 'hide_condition'] 대신 간단한 팁 kwargs.pop ( 'hide_condition', False). 인수가없는 경우를 처리하고 기본값과 del을 동시에 사용하십시오.
christophe31

2
팁, christophe31에 감사드립니다. 코드가 훨씬 명확 해 지므로 귀하의 제안으로 업데이트되었습니다.
rych

1
이 방법으로 필드를 완전히 숨길 수 있습니까? 당신이 설정 한 경우처럼 class Meta: exclude = ["fieldname"]. 여기서 문제는 메타 접근 방식이 "정적"이지만 역동적 인 것이 필요하다는 것입니다. stackoverflow.com/questions/20243735/…를
Themerius

당신은 가장 깨끗한 방법은 택시 디 def __init __ (self, hide_condition = True, * args, ** kwargs) ...
Visgean Skeloru

22

정상적인 형태로 할 수 있습니다

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())

모델 양식이있는 경우 다음을 수행 할 수 있습니다.

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}

__init__방법 을 무시할 수도 있습니다

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()

1

필드를 항상 숨기려면 다음을 사용하십시오.

class MyForm(forms.Form):
    hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")

0

당신은 단지 CSS를 사용할 수 있습니다 :

#id_fieldname, label[for="id_fieldname"] {
  position: absolute;
  display: none
}

이렇게하면 필드와 레이블이 보이지 않게됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.