Указание атрибута виджета Django в ModelForm, а не в HTML <style>
У меня есть слайдер ввода Django, определенный следующим образом:
#widgets.py
from django.forms.widgets import NumberInput
class RangeInput(NumberInput):
input_type = 'range'
#forms.py
from polls.widgets import RangeInput
class VoteForm(forms.ModelForm):
class Meta:
#model = CC_Responses
model = CC_Resp_NoFK
fields = ['Person_ID', 'Test_date', 'Response_value']
# following added from SliderModelForm
widgets ={
'Response_value':RangeInput
}
который "обрабатывается" представлением
def p2vote(request,q_id):
CC_question = get_object_or_404(CC_Questions, pk=q_id)
#
if request.method == 'POST':
form = VoteForm(request.POST)
if form.is_valid():
item = form.save(commit=False)
item.Q_ID = q_id
item.save()
return redirect('/polls/p2')
else:
formV = VoteForm()
return render(request, 'pollapp2/vote.html', {'var_name':CC_question,'form' : VoteForm()})
и в шаблоне у меня есть встроенный CSS
<style>
/* Following CSS is used by the input slider (range) since Django assigns id value of id_Response_value */
/*See: https://stackoverflow.com/questions/110378/change-the-width-of-form-elements-created-with-modelform-in-django */
#id_Response_value{width:300px;}
</style>
который связан с ползунком/диапазоном
<label for="Response_value">Response value</label>
{% render_field form.Response_value rows="1" class="form-control" %}
Я получил значение id_Response_value, посмотрев на источник отрисованного HTML в браузере - полагаю, я мог бы явно задать ID. Все вышеописанное работает именно так, как я хочу. Я могу управлять шириной ползунка диапазона с помощью CSS.
Теперь, я считаю, что инлайн CSS - это "плохая вещь", поэтому в качестве шага по улучшению своего кода я пытаюсь связать атрибут "более непосредственно" со слайдером.
В документации Django в разделе: https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#overriding-the-default-fields
есть следующий пример:
from django.forms import ModelForm, Textarea
from myapp.models import Author
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ('name', 'title', 'birth_date')
widgets = {
'name': Textarea(attrs={'cols': 80, 'rows': 20}),
}
Созданный словарь attrs выглядит так, будто в нем есть CSS "штуки", поэтому я закодировал виджеты в форме модели в forms.py
from polls.widgets import RangeInput
class VoteForm(forms.ModelForm):
class Meta:
model = CC_Resp_NoFK
fields = ['Person_ID', 'Test_date', 'Response_value']
widgets ={
'Response_value':RangeInput(attrs={'width': '1000px'}),
}
Я пробовал оба варианта:
attrs={'width': '1000px'}
и
attrs={'width': 1000}
Ни то, ни другое не изменило ширину ползунка диапазона. Возможно ли то, что я делаю, в (модельной)форме? Может быть, у меня просто проблема с тем, что я кодирую в attrs?
Возможно, я неправильно понял, но я вижу что-то вроде следующего продвигаемого как то, что должно быть в ModelForm
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
self.fields['long_desc'].widget.attrs['cols'] = 10
self.fields['long_desc'].widget.attrs['rows'] = 20
Нет. Правда? Чтобы изменить атрибуты?