我有一个带有2个输入的表格。我正在使用CreateView和ModelForm。还有{%form%}。
问题:
“按入”时,我需要第二个输入(已经具有初始值),将光标置于字符串的末尾。
当前行为:
当“制表符”进入第二个输入时,它将突出显示整个字符串。
到目前为止我所拥有的:
我可以通过将以下代码行添加到我的ModelForm init中来自动对焦:
self.fields['description'].widget.attrs['autofocus'] = 'on'
。
我当时在想这样的事情:
self.fields['inc_number'].widget.attrs['onfocus'] = 'INC'[:0]
(“ INC是初始值)也许可以解决问题。我没有收到任何错误,但是当我从描述输入中制表时,它仍然只是突出显示了整个字符串。
对于我的代码,我将尝试仅关注最相关的部分。
models.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)
...
views.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”输入到输入中的方法
forms.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%}与一些Bootstrap 4一起使用。但是这就是为什么我无法将onfocus逻辑直接放在输入上的原因。
期望的行为:
用户输入完“描述”后,按“ Tab”,光标移至“ inc_number”输入的“ INC”(初始值)的末尾。 (这样做的目的是使他们不要删除“ INC”,而是添加到它的末尾。
答案 0 :(得分:1)
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
答案 1 :(得分:0)
因此,在“ 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)'