2013-10-21 15 views
24

Ben models.py sınıf, id nasıl eklenir, tutucu django modelinde bir alana niteliklerini

altına

class Product(models.Model): 
    name = models.CharField(max_length = 300) 
    description = models.TextField(max_length = 2000) 
    created = models.DateTimeField(auto_now_add = True) 
    updated = models.DateTimeField(auto_now = True) 

    def __unicode__(self): 
     return self.name 

forms.py

gibi bir django modeli var oluşturur
class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

product_form.py (sadece bir örnek)

<form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post"> 
     <div id="name"> 
      {{form.name}} 
     </div> 
     <div id="description"> 
      {{form.description}} 
     </div> 
    </form> 

Aslında gösterilecek/işlemek istedikleri gibi html çıktı Sonunda Yukarıdaki kodda modeli form alanları için özelliklerini (id, yer tutucu, sınıfı) nasıl ekleneceğini

<input id="common_id_for_inputfields" type="text" placeholder="Name" class="input-calss_name" name="Name"> 

<input id="common_id_for_inputfields" type="text" placeholder="Description" class="input-calss_name" name="description"> 

altında?

cevap

32

Şunları yapabilirsiniz:

#forms.py 
class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['description'].widget = TextInput(attrs={ 
      'id': 'myCustomId', 
      'class': 'myCustomClass', 
      'name': 'myCustomName', 
      'placeholder': 'myCustomPlaceholder'}) 
+2

Bu benim için iyi çalıştı. Widget bildirimini hep birlikte atlayabileceğinizi ve özelliklerini şu şekilde ayarlayabileceğinizi öğrendim: 'self.fields ['description'].attrs = { 'id': 'myCustomId', 'sınıf': 'myCustomClass', 'adı': 'myCustomName', 'tutucu': 'myCustomPlaceholder'} ' Ayrıca benim için biraz daha temiz görünüyor. – bjesus

+0

Eğer her seferinde cevabımı aşağıda görüyorsanız kurucuyu geçersiz kılmak zorunda kalmadan tüm formlara önyükleme sınıfları eklemek istiyorsunuz. – hurlbz

24

Saha kimlikleri, django tarafından otomatik olarak oluşturulur olmalıdır diğer alanları geçersiz kılmak için:

class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['name'].widget.attrs\ 
      .update({ 
       'placeholder': 'Name', 
       'class': 'input-calss_name' 
      }) 
+0

Kimlikler gerçekten otomatik olarak oluşturulmalı mı? Kimliği de geçersiz kılabilirsiniz. –

+0

Kimliği de geçersiz kılabilirsiniz (tıpkı size gösterdiğim gibi, herhangi bir özelliği geçersiz kılabilirsiniz), ancak django tarafından oluşturulan kimlikleri kullanmanın daha iyi olacağını düşünüyorum. Üzerlerinde herhangi bir denetiminiz yoksa (3. taraf js kullandığınızda olduğu gibi) kütüphaneler veya smth ..) – mariodev

+0

'form.fields' ??? "self.fields" – suhailvs

11

Aşağıdaki şekilde forms.py güncelleyebilirsiniz

 class ProductForm(ModelForm): 
      class Meta: 
        model = Product 
        exclude = ('updated', 'created') 
        widgets={ 
         "name":forms.TextInput(attrs={'placeholder':'Name','name':'Name','id':'common_id_for_imputfields','class':'input-class_name'}), 
         "description":forms.TextInput(attrs={'placeholder':'description','name':'description','id':'common_id_for_imputfields','class':'input-class_name'}), 

        } 
1

Aşağıdakileri yapabilirsiniz:

class ProductForm(ModelForm): 
    name = forms.CharField(label='name ', 
      widget=forms.TextInput(attrs={'placeholder': 'name '})) 
3

, bu yüzden elle Her alan için form giriş widget'lar yeniden oluşturmak gerekmez tüm form alanlarına önyükleme sınıf ekleyerek mükemmel mariodev cevap Biraz değiştirilmiş versiyonu (kısa Python 3.x süper()):

class ProductForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     for field in self.Meta.fields: 
      self.fields[field].widget.attrs.update({ 
       'class': 'form-control' 
      }) 
+2

Ayrıca "self.Meta.fields" adlı "self.fields" kullanırsanız çalışır. – j4n7

19

Ben gerçekten Dmitriy Sintsov'un cevabını seviyorum ama işe yaramıyor.

def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    for field in iter(self.fields): 
     self.fields[field].widget.attrs.update({ 
      'class': 'form-control' 
    }) 
+0

Bu, her zaman tüm Widget'ı oluşturmaya daha iyi. Bunu yapan forms.ModelForm'u genişleten bir sınıf BasicForm oluşturdum. Model formu yerine sadece BasicForm'u genişletiyorum ve tüm formlarda otomatik olarak bootstrap sınıfları alıyorum. Bir adım daha ileri gittim ve sınıfları zaten orada olabilecek herhangi bir özel css sınıfına ekledim. Kod örneği için cevabımı görün. – hurlbz

3

Derick Hayes cevap ekleme bunu uzanan her forma önyükleme sınıfları ekler forms.ModelForm genişleten bir sınıf BasicForm yarattı: Burada iş yapan bir versiyonu.

Formlarım için model formu yerine BasicForm'u genişletiyorum ve otomatik olarak tüm formlarda önyükleme sınıfları alıyorum. Bir adım daha ileri gittim ve sınıfları zaten orada olabilecek herhangi bir özel css sınıfına ekledim. alanını oluşturmak için bir CSS sınıfı eklemek için

class BaseModelForm(forms.ModelForm): 

def __init__(self, *args, **kwargs): 
    super(BaseModelForm, self).__init__(*args, **kwargs) 
    # add common css classes to all widgets 
    for field in iter(self.fields): 
     #get current classes from Meta 
     classes = self.fields[field].widget.attrs.get("class") 
     if classes is not None: 
      classes += " form-control" 
     else: 
      classes = "form-control" 
     self.fields[field].widget.attrs.update({ 
      'class': classes 
     }) 
1

add_class filtresi: benim seç widget'ından tüm seçenekleri sildim dışında

{% load widget_tweaks %}  
    <form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post"> 
       <div id="name"> 
        {{form.name|add_class:"input-calss_name"}} 
       </div> 
       <div id="description"> 
        {{form.description|add_class:"input-calss_name"}} 
       </div> 
      </form> 

django-widget-tweaks library