模板显示外键而不是CharField用于禁用字段

时间:2016-08-22 07:44:44

标签: python django django-forms

我正在使用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)。看来,如果您的表单包含来自其他模型的字段,那么尝试禁用该字段会导致该字段仅显示外键而不是其他表中的实际值。

1 个答案:

答案 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'