簡體   English   中英

在表格中將初始化的外鍵字段設為只讀

[英]Making initialized foreign key field as read-only in the form

我的表單中有一個外鍵字段,初始化為:

form=myform(intial= {'val':abc.objects.get(pk=id)})

我已經分別嘗試了以下代碼集,以使字段“ val”成為只讀值。

form.fields['val'].widget = forms.HiddenInput()
form.fields['val'].widget.attrs['readonly'] = True
form.fields['val'].widget.attrs['disabled'] = True
form.fields['val'].widget.attrs['disabled'] = 'disabled'
form.fields['val'].widget.attrs['disabled'] = False
form.fields['val'].widget.attrs['display_only'] = True
form.fields['val'].widget.attrs['editable'] = False

HiddenInput有效,但未在表單中顯示該字段,而disabled顯示錯誤。 readonly於除外鍵字段以外的所有字段。

我通過重寫“選擇”小部件的render方法並更改其輸出來做到這一點。

class ReadOnlySelect(Select):
    """
    This should replace the Select widget with a disabled text widget displaying the value, 
    and hidden field with the actual id
    """
    def render(self, name, value, attrs=None, choices=()):
        final_attrs = self.build_attrs(attrs, name=name)
        display = "None"
        for option_value, option_label in chain(self.choices, choices):
            if str(option_value) == (value) : 
                display = option_label 
        output = format_html('<input type=text value="%s" disabled="disabled" ><input type="hidden" value="%s"  %s> ' % (display, value, flatatt(final_attrs)))

        return mark_safe(output)

有關Django代碼片段的完整示例。 https://djangosnippets.org/snippets/10436/

我有類似的問題,因此我決定使用其他方法。 首先,我以這種方式定義自己的表格類,例如:

class MyForm(ModelForm):

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)

class Meta:
    model = YourModel
    exclude = ('foreign_key_field')

然后在模型中,myModel確實是這樣的:

foreign_key_field = models.ForeignKey(KeyField)

def set_values(self, *args, **kwargs):
    foreign_key_field = kwargs.pop('foreign_key_field')

我定義函數來設置只讀的字段值。 我在views.py中創建表單對象后調用此方法。 (提交表格后)

最后是views.py:

if form.is_valid():
        new_instance = form.save(commit=False)
        new_instance.set_values(
              foreign_key_field='YOUR VALUE',
              )
        new_instance.save()

我從表單中排除了此字段,但是在創建實例后我正在設置值。 設置值后,我保存到數據庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM