2013-10-21 2 views
24

내가 models.py 클래스, ID를 추가하는 방법, 자리 장고 모델의 필드 속성을

아래

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

같은 장고 모델이 형성
class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

product_form.py (예)

<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> 

사실은 내가/표시 렌더링 할 같은 HTML 출력 그래서 마지막으로 위의 코드에서 모델 양식 필드에 속성 (ID, 자리, 클래스)를 추가하는 방법을

<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"> 

아래?

답변

32

당신은 다음을 수행 할 수 있습니다

#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

이것은 나를 위해 잘 작동. 위젯 선언을 모두 건너 뛰고 여전히 그 속성을 다음과 같이 설정할 수 있다는 것을 알게되었습니다 : 'self.fields [ 'description']. widget.바인드합니다 = { 'ID': 'myCustomId', '클래스': 'myCustomClass', '이름': 'myCustomName', '자리': 'myCustomPlaceholder는'} ' 또한 나를 위해 조금 청소기를 보인다. – bjesus

+0

아래에서 내 대답을 볼 때마다 생성자를 재정의 할 필요없이 모든 폼에 부트 스트랩 클래스를 추가하고 싶다면. – hurlbz

24

필드 ID가, 장고에 의해 자동으로 생성해야 다른 필드를 오버라이드 (override) :

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

정말 신분증을 자동으로 생성해야합니까? id도 무시할 수 있습니다. –

+0

당신은 ID를 오버라이드 할 수 있습니다. (당신이 보여준 것처럼, 당신은 어떤 속성도 오버라이드 할 수 있습니다.)하지만 당신이 그들을 제어 할 수 없다면 django가 id를 생성하는 것이 더 낫다고 생각합니다. 도서관 또는 smth ..) – mariodev

+0

'form.fields' ??? 그것은'self.fields'이어야합니다 – suhailvs

11

당신은 다음과 같이 forms.py 업데이트 할 수 있습니다

 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

다음을 수행 할 수 있습니다.

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

, 그래서 수동으로 각 필드에 대한 양식 입력 위젯을 다시 만들 필요가 없습니다 모든 양식 필드에 부트 스트랩 클래스를 추가하는 우수한 mariodev 응답의 약간 수정 된 버전 (짧은 파이썬 3.x의 슈퍼()) :

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

"self.fields"insted "self.Meta.fields"를 사용하는 경우에도 작동합니다. – j4n7

19

나는 Dmitriy Sintsov의 답변을 정말 좋아하지만 작동하지 않습니다.

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

매번 전체 위젯을 구성하는 것보다 훨씬 낫습니다. 이 작업을 수행하는 forms.ModelForm을 확장하는 BasicForm 클래스를 만들었습니다. 필자는 모델 폼 대신 BasicForm을 확장하고 모든 폼에서 자동으로 부트 스트랩 클래스를 얻습니다. 나는 한 걸음 나아가 이미 클래스에있는 커스텀 CSS 클래스에 클래스를 추가했다. 코드 예를 보려면 내 대답을 참조하십시오. – hurlbz

3

Derick 헤이즈에서 답변을 추가 내가 그것을 확장 모든 형태에 부트 스트랩 클래스를 추가 forms.ModelForm를 확장하는 클래스의 BasicForm을 만들어 : 다음 작업을 수행하는 버전입니다.

제 폼의 경우 모델 폼 대신 BasicForm을 확장하고 모든 폼에서 자동으로 부트 스트랩 클래스를 얻습니다. 나는 한 걸음 나아가 이미 클래스에있는 커스텀 CSS 클래스에 클래스를 추가했다. 필드를 형성하기 위해 CSS 클래스를 추가하는

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 필터 : 내 선택 위젯에서 모든 옵션을 삭제하는 것을 제외

{% 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