将光标聚焦到输入值的末尾(CreateView、ModelForm)

2024-05-23 17:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个表格有两个输入。我正在使用CreateView和ModelForm。和{%form%}。你知道吗

问题:

我需要第二个输入(已经有一个初始值)当“tabbed”到时,将光标放在字符串的末尾。
当前行为:
当“tab”进入第二个输入时,它高亮显示整个字符串。你知道吗

到目前为止我所拥有的:
通过将这行代码添加到ModelForm init中,我可以自动对焦: self.fields['description'].widget.attrs['autofocus'] = 'on'。你知道吗

我在想这样的事情: self.fields['inc_number'].widget.attrs['onfocus'] = 'INC'[:0] (“INC是初始值”)可能会解决问题。我没有得到任何错误,但它仍然只是突出显示整个字符串时,我从描述输入选项卡。你知道吗

对于我的代码,我将尝试只关注最相关的部分。你知道吗

你知道吗型号.py你知道吗

class ITBUsage(models.Model):
    """ ITB usage """

    itb = models.ForeignKey(IncidentTriageBridge, related_name='itb',
                            on_delete=models.DO_NOTHING, verbose_name="ITB name")
    description = models.CharField(max_length=100, verbose_name="Description", null=True)
    inc_number = models.CharField(max_length=20, verbose_name="Incident number", null=True)
    ...

你知道吗视图.py你知道吗

class StartItb(CreateView):
    # class StartItb(CreateView):
    """ Start a bridge by adding a new row in ITBUsage """
    model = models.ITBUsage
    form_class = forms.StartItbForm
    template_name = "itb_tracker/start_form.html"

    initial = {'inc_number': "INC"}  # prefill INC for user

    def get_form_kwargs(self):
        """ inject the extra data """
        kwargs = super().get_form_kwargs()
        ...
        return kwargs 

    def form_valid(self, form):
        ...
        return super().form_valid(form)

上图:initial = {'inc_number': "INC"}这是我当前如何将“INC”输入到输入中的

你知道吗表单.py地址:

class StartItbForm(forms.ModelForm):
    """ Start a bridge by adding a for in ITBUsage """

    class Meta:
        model = models.ITBUsage
        fields = ['description', 'inc_number']

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

        super().__init__(*args, **kwargs)

        self.fields['description'].widget.attrs['autofocus'] = 'on'

    def clean(self):
    ...
        return cleaned_data

    def clean_inc_number(self):
        """ Validate the INC Number is in the correct format """
        inc_number = self.cleaned_data['inc_number']

        if inc_number and not re.match(r'INC[0-9]+', inc_number):
            raise forms.ValidationError("Format must be 'INC' followed by a number. For example: 'INC123456'")
        return inc_number

    def save(self, commit=True):
        """ inject extra data """
        ...
        return super().save(commit)

上图:self.fields['description'].widget.attrs['autofocus'] = 'on'是我如何将光标设置为指向页面时的第一个输入(描述)。你知道吗

我的表单html只是使用{%form%}和一些bootstrap4。功能正常。但这就是为什么我不能将onfocus逻辑直接放在输入上。你知道吗

期望的行为:
用户输入完“description”后,点击“Tab”,光标移到“INC\u number”输入的“INC”(初始值)末尾。(目的是不删除“INC”,而是在其末尾加上。你知道吗


Tags: nameselfformnumberfieldsreturnmodelsdef
2条回答

基于“rje”的帮助,这就是我解决问题的方法。你知道吗

我不需要在视图中设置首字母。
而是self.fields['inc_number'].initial = "INC"的形式。
这样我就可以得到长度(而不是硬编码到3)。
length = len(self.fields['inc_number'].initial)。你知道吗

溶液线为
self.fields['inc_number'].widget.attrs['onfocus'] = 'this.setSelectionRange(length, length)'

widget.attrs包含小部件的HTML属性。您可以设置onfocus属性,它必须是一个JavaScript函数。你知道吗

所以应该是这样的:

self.fields['inc_number'].widget.attrs['onfocus'] = 'this.setSelectionRange(..)

尽管我不确定这在任何地方都适用-请看以下帖子:How to set cursor position at the end of input text in Google Chrome

相关问题 更多 >