Формы 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.