Как добавить атрибуты класса, id, placeholder в поле в формах модели django
У меня есть модель django, как показано ниже
models.py
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, как показано ниже
<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">
Итак, как добавить атрибуты (id, placeholder, class) в поля формы модели в приведенном выше коде?
Ответы
Ответ 1
Вы можете сделать следующее:
#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
Идентификаторы полей должны генерироваться автоматически django, чтобы переопределить другие поля:
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'
})
Ответ 3
Мне очень нравится ответ Дмитрия Синцова, но он не работает. Вот версия, которая работает:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in iter(self.fields):
self.fields[field].widget.attrs.update({
'class': 'form-control'
})
Ответ 4
Вы можете обновить 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'}),
}
Ответ 5
Немного измененная версия превосходного ответа mariodev, добавляющая класс bootstrap ко всем полям формы, поэтому мне не нужно повторно создавать виджеты ввода формы для каждого поля вручную (короткий Python 3.x super()):
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'
})
Ответ 6
Добавляя ответы от Derick Hayes, я создал класс BasicForm, который расширяет формы. ModelForm, который добавляет классы начальной загрузки в каждую форму, которая его расширяет.
Для моих форм я просто расширяю BasicForm вместо формы модели и автоматически получаю классы начальной загрузки во всех формах. Я сделал еще один шаг и добавлю классы к любым специальным классам 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
})
Ответ 7
Вы можете сделать следующее:
class ProductForm(ModelForm):
name = forms.CharField(label='name ',
widget=forms.TextInput(attrs={'placeholder': 'name '}))
Ответ 8
add_class фильтр для добавления класса CSS для формирования поля:
{% 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