Поле 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'
        })

Вот результат:

Скриншот селекта с пользовательской пустой меткой

Вернуться на верх