Django form alanını gizli bir alana dönüştürme


128

RegexFieldNormal bir metin giriş alanına çok benzeyen bir Django formum var .

Benim görüşüme göre, belirli koşullar altında onu kullanıcıdan gizlemek istiyorum ve formu olabildiğince benzer tutmaya çalışıyorum. Bu alanı bir HiddenInputtarlaya dönüştürmenin en iyi yolu nedir ?

Alandaki özellikleri şu şekilde ayarlayabileceğimi biliyorum:

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

İstenilen başlangıç ​​değerini şu şekilde ayarlayabilirim:

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

Ancak bu, widget'ın biçimini değiştirmez.

Bu alanı bir <input type="hidden">alan yapmanın en iyi / en "django-y" / en az "hacky" yolu nedir?

Yanıtlar:


169

Özel bir şablonunuz ve görünümünüz varsa, alanı hariç tutabilir {{ modelform.instance.field }}ve değeri almak için kullanabilirsiniz .

ayrıca görünümde kullanmayı da tercih edebilirsiniz:

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

ancak postadaki kaydetme yöntemini koruyacağından emin değilim.

Umarım yardımcı olur.


1
&quot;&quot; is not a valid value for a primary key.Bu çözümü kullandıktan sonra is_valid yönteminde bir buluyorum.
Jens Timmerman

Garip geliyor. Sanırım başka bir şeyle ilgili, oluşturduğunuz nesnelerin birincil anahtarını HiddenInput olarak mı görüntülüyorsunuz? Cevabınız evet ise, yapmamalısınız.
christophe31

Belki bunu söylemeye gerek yok, ancak bu işe yaramadan önce formları içe aktarmanız gerekecek. from django import forms
teewuane

2
1.7'de şu sözdizimini kullanın: hidden_field_name = forms.CharField(label='reset', max_length=256, widget=forms.HiddenInput())burada anahtar, sondaki daha yeni pencere öğesi sözdizimidir. İhtiyaçlarınız için ince ayar yapın.
Marc

196

Bu ayrıca yararlı olabilir: {{ form.field.as_hidden }}


3
Bu en iyi cevap IMHO. Bir form alanının görünümünü belirlemek için "denetleyici" Python kodumu kullanmaktan her zaman nefret etmişimdir.
trpt4him

Sık sık crispyforms ile genel form şablonu hazırlıyorum. Crispyforms kullanıyorsanız veya form yapınızın form sınıfınızda olmasını istediğiniz için alanları basit bir döngüde görüntülerseniz, formda geçersiz kılan pencere aracı bunu yapmanın iyi bir yoludur. Ancak form oluşturma işleminizi şablonunuzda yönetirseniz, bu çözüm gerçekten çok daha net / temizdir.
christophe31

Bunun sahaya önceden uyguladığınız tüm sınıfları siliyor gibi göründüğünü belirtmekte fayda var ...
John Aaron

59

benim için çalışan bir seçenek, alanı orijinal formda şu şekilde tanımlayın:

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

sonra onu yeni Sınıfta geçersiz kıldığınızda yerini koruyacaktır.


45

İlk olarak, kullanıcının verileri değiştirmesini istemiyorsanız, alanı hariç tutmak daha temiz görünür. Bunu gizli bir alan olarak dahil etmek, kablo üzerinden göndermek için daha fazla veri ekler ve kötü niyetli bir kullanıcıyı istemediğinizde onu değiştirmeye davet eder. Alanı eklemek ama gizlemek için iyi bir nedeniniz varsa, modelformun yapıcısına bir arg anahtar sözcüğü iletebilirsiniz. Belki bunun gibi bir şey:

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.

Sonra size göre:

form = MyModelForm(hide_condition=True)

Görünümde model formun iç kısımlarını değiştirmek için bu yaklaşımı tercih ederim, ama bu bir zevk meselesi.


11
sadece basit bir ipucu, kwargs ['hide_condition'] yerine kwargs.pop ('hide_condition', False). no arg durumunu halledecek, aynı anda bir varsayılan ve dele sahip olacaksınız.
christophe31

2
bahşiş için teşekkürler, christophe31. Kodu daha net hale getirdiği için önerinizle güncelledik.
rych

1
Bu yaklaşımla alanı tamamen gizlemek mümkün mü? Sanki sen başlarsan class Meta: exclude = ["fieldname"]. Buradaki sorun, Meta yaklaşımın "statik" olmasıdır, ancak dinamik bir şeye ihtiyacım var. Stackoverflow.com/questions/20243735/… sayfasına
Themerius

Sen cab di def __init __ (self, hide_condition = True, * args, ** kwargs) ki bu en temiz yoldur ...
Visgean Skeloru

22

Normal form için yapabilirsiniz

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

Model formunuz varsa aşağıdakileri yapabilirsiniz

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

Ayrıca __init__yöntemi geçersiz kılabilirsiniz

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

1

Alanın her zaman gizli kalmasını istiyorsanız, aşağıdakileri kullanın:

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

0

Sadece css kullanabilirsiniz:

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

Bu, alanı ve etiketini görünmez hale getirecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.