Поле Select формы редактирования не показывает пустую метку или не отображает выбранное значение в DJango
У меня есть ModelForm с именем ProductForm с моделью Product, отношение многие к одному с Type. Поэтому автоматически эта форма создает мне Select для выбора Type из Product. Затем, если я устанавливаю все данные в ModelForm в соответствии с документацией Django, все работает хорошо, но я хотел бы добавить эмпирическую метку к Select. Например, так:
class Product(models.Model):
type= models.ForeignKey(Types, on_delete=models.CASCADE)
code=models.CharField(max_length=50)
name=models.CharField(max_length=1000)
details=models.CharField(max_length=1000)
um=models.CharField(max_length=50)
def __str__(self):
return self.name
class ProductForm(ModelForm):
class Meta:
model = Product
fields='__all__'
labels = {
'code': 'Code',
'name': 'Product',
'type':'Product type',
'um': 'UM',
'details': 'Details'
}
widgets = {
'code': TextInput(
attrs={
'class':'form-control',
'placeholder':'Code'
}
),
'name': TextInput(
attrs={
'class':'form-control',
'placeholder':'Product'
}
),
'um': TextInput(
attrs={
'class':'form-control',
'placeholder':'UM'
}
),
'type' : Select(attrs={'style':'width: 100%', 'class':'form-control select2bs4'}),
'details': Textarea(
attrs={
'style':'height:150px',
'class':'form-control',
'placeholder':'Details'
}
),
}
Но при этом я не знаю, куда поместить пустую_ярлык для Select, потому что emtpy_label предназначен для ModelChoise. Поэтому я использую другое решение, изменяя ModelForm как показано ниже (только этот код, не код выше), работает пустая метка, но форма редактирования, не показывает выбранное значение, Так что это одно или другое, но мне нравятся оба варианта:
class ProductForm(ModelForm):
code= CharField(label='Code',widget=TextInput(attrs={'class':'form-control','placeholder':'Code'}))
name = CharField(label='Product',widget=TextInput(attrs={'class':'form-control', 'placeholder':'Product'}))
um = CharField(label='UM',widget=TextInput(attrs={'class':'form-control', 'placeholder':'UM'}))
type= ModelChoiceField(label='Product Type',queryset=Types.objects.all(), empty_label='Please select one: ', widget=Select(attrs={'style':'width: 100%', 'class':'form-control select2bs4'}), to_field_name='type')
details = CharField(label='Details',widget=Textarea(attrs={'style':'height:150px', 'class':'form-control', 'placeholder':'Details'}))
class Meta:
model = Product
fields='__all__'
Я просто убираю , to_field_name='type' и работает!!!!
Вы можете сделать следующее:
from django import forms
from core import models
class ProductForm(forms.ModelForm):
class Meta:
model = models.Product
fields='__all__'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['type'].label = 'Product type'
self.fields['type'].empty_label = 'Select a product type'
self.fields['type'].widget.attrs.update({
'style':'width: 100%',
'class':'form-control select2bs4'
})
Вот результат: