Формы Django - Как я могу обновить форму с отключенным обязательным полем?

У меня есть модель Django с одним обязательным полем (shpid). Я хочу отключить это поле при обновлении формы. Хотя значение этого поля отображается и отключено при первом отображении шаблона, я получаю сообщение об ошибке crispy-forms с сообщением "this field is required", при этом поле отображается пустым при попытке обновления.

Я использую crispy-forms и FormHelper для оформления страницы.

Соответствующей частью forms.py является:

class UpdateShpForm(ModelForm):

    class Meta:
        model = Shipment
        fields = '__all__'
        widgets = {
            "shpid": TextInput(attrs={'disabled':False,'style':'max-width:120px'}),  <=== Note diabled attribute
            "costs": TextInput(attrs={'style':'max-width:200px'}),
            "coldate": DateInput(attrs={'type': 'date','style':'max-width:180px'}),
            "deldate": DateInput(attrs={'type': 'date','style':'max-width:180px'}),
            "sts_date": DateInput(attrs={'type': 'date','style':'max-width:180px'}),

        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['shpid'].label = "Shipment ID"
        self.fields['awb'].label = "AWB"
        self.fields['pod'].label = "POD"
        self.fields['coldate'].label = "Collection Date"
        self.fields['deldate'].label = "Delivery Date"
        self.fields['recipient'].label = "Recipient"
        self.fields['status'].label = "Status"
        self.fields['sts_date'].label = "Status Date"
        self.fields['costs'].label = "Costs"

        self.helper = FormHelper()
        self.helper.layout = Layout(
            Row (
                Column('shpid',css_class='form-group col-md-3 mb-0 pe-4'),
                Column('status',css_class='form-group col-md-3 mb-0 ps-2 pe-2'),
                Column('sts_date', css_class='form-group col-md-3 mb-0 ps-4'),
            ),
            Row(
                Column('awb',css_class='form-group col-md-6 mb-0 pe-4'),
                Column('pod',css_class='form-group col-md-6 mb-0 pe-4'),
            ),
            Row(
                Column('coldate', css_class='form-group col-md-3 mb-0 pe-4'),
                Column('deldate', css_class='form-group col-md-3 mb-0 ps-2 pe-2'),
                Column('recipient', css_class='form-group col-md-3 mb-0'),
            ),
            Field('costs'),
           ButtonHolder(
                Submit('submit', 'Update Shipment', css_class='ms-5 px-3 fw-bold'),

               css_class='center'
            )
        )
        self.helper.form_class = 'form-horizontal'

Соответствующей частью views.py является:

def update_shipment(request,shpid,orderid):

    if shpid == 'None':
        ###  When called from a list this will be either 'None' or an existing shpid
        add_shipment(request,orderid)
        return render(request,'tracker/add_shipment.html', {'form':AddShpForm()})
    else:
        instance = Shipment.objects.get(shpid=shpid)
        shp_form = UpdateShpForm(request.POST or None, instance=instance)
        print('##########  Checking for Validity  ############')
        if shp_form.is_valid():
            print('========  Form is valid  ===============')
            shp_form.save()
            orders = Order.objects.all()
            messages.success(request,f'Shipment no: {shpid} has been updated')
            return render(request,'tracker/list_orders.html',{'orders':orders})
        else:
            return render(request,'tracker/update_shipment.html', {'form':shp_form, 'shpid':instance})

В настоящее время я отключаю поле shpid с помощью виджета (shpid), который отлично работает при первом отображении формы, но выдает ошибку при сохранении формы, поскольку crispy-forms решил, что оно пустое.

Как я могу отключить обязательное поле, не вызывая проблем при попытке сохранить форму, оформленную с помощью crispy-forms?

Вы не можете отключить элемент ввода формы (или "виджет" здесь). Я имею в виду, что вы можете, но если вы это сделаете, его значение будет полностью проигнорировано. Вместо этого используйте readonly=True. Таким образом, значение действительно будет отправлено при отправке формы.

Смотрите страницу атрибута только для чтения в MDN.

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