我正在使用Django 1.97并拥有以下型号:
class Symbol(models.Model):
symbol = models.CharField(max_length=15)
# more fields
class Position(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
symbol = models.ForeignKey(Symbol)
# more fields
def get_user_positions_qs(self, user):
positions = Position.objects.all().select_related('symbol').filter(user=user).order_by('symbol')
return positions
我需要在模板中显示登录用户位置的模型,但需要禁用symbol
字段。到目前为止,我的观点中有以下内容:
position = Position()
form_class = PortfolioForm
PositionModelFormSet = modelformset_factory(Position, fields=('symbol', 'various_other_fields'), form=form_class)
def get(self, request):
positions = self.position.get_user_positions_qs(user=request.user)
position_formset = self.PositionModelFormSet(queryset=positions)
return render(request,
'template.html',
{'position_formset': position_formset})
形式:
class PortfolioForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PortfolioForm, self).__init__(*args, **kwargs)
self.fields['symbol'].widget = forms.TextInput(attrs={'disabled': True})
class Meta:
model = Position
fields = ['symbol', 'various other fields']
问题在于,在显示表单时,symbol
字段仅包含外键ID,而不是symbol CharField
中的实际symbol model
。如果我更改表单以便不禁用symbol
字段,则模板中的symbol
字段会显示正确的值,但是它会有一个下拉列表,允许用户更改不是允许的。
所以我的问题是,如何在继续显示symbol
symbol
中找到的CharField
值时,禁用模板中的symbol model
字段(即:不只是指向该记录的外键id)。看来,如果您的表单包含来自其他模型的字段,那么尝试禁用该字段会导致该字段仅显示外键而不是其他表中的实际值。
答案 0 :(得分:1)
问题是您正在为FKey字段使用Textinput小部件,默认情况下将其视为查找字段。为什么不将它作为禁用的下拉字段?
self.fields['symbol'].widget.attrs['disabled'] = 'disabled'
编辑:替代解决方案
根据您的评论,这是我认为应该有效的另一种解决方案:
class PortfolioForm(forms.ModelForm):
symbol_text = forms.CharField()
class Meta:
fields = ('symbol', 'other fields')
model = Position
def __init__(self, *args, **kwargs):
super(PortfolioForm, self).__init__(*args, **kwargs)
self.fields['symbol_text'].widget.attrs['value'] = self.instance.symbol
self.fields['symbol_text'].widget.attrs['disabled'] = 'disabled'