Почему бы просто не использовать отключенный вход вместо того, чтобы пытаться заменить его?
http://reference.sitepoint.com/html/input/disabled
class MyForm(forms.ModelForm):
apple = models.CharField(widget=forms.TextInput(attrs={'disabled':'disabled'}))
Если вам нужно динамически решить, следует ли устанавливать ввод как отключенный (в отличие от вышеупомянутого, где он всегда отключен), вы можете перезаписать конструктор
class MyForm(forms.ModelForm):
apple = models.CharField(widget=forms.TextInput())
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
if something:
self.fields['apple'].widget.attrs["disabled"] = 'disabled'
EDIT Чтобы поле отображалось в виде строки, вам необходимо переопределить виджет (т. Е. HTML-код, используемый для отображения этого поля формы).Проблема в том, что если вы не включите текст в какой-либо элемент формы, он будет потерян при отправке формы.Самый простой способ обойти это - создать собственный виджет, который отображает строку и строку как скрытое текстовое поле ввода:
Создание форм widgets.py:
from django.forms import widgets
class StringWidget(widgets.Input):
def render(self, name, value, attrs=None):
# Create a hidden field first
hidden_field = widgets.HiddenField(attrs)
return mark_safe(u'<p>%s</p>%s' % (value, hidden_field.render(value, attrs))
.py
from myapp.widgets import StringWidget
class MyForm(forms.ModelForm):
apple = models.CharField(widget=StringWidget())
Это создаст что-то вроде следующего в вашем шаблоне, когда вы зациклите его:
<p>granny smith</p>
<input type="hidden" class="..." name="id_apple" value="granny smith" />
т.е. пользователь сможет видеть, но не редактировать его.