Обработка нескольких пользовательских вводов в поле пользовательской формы Django: Обработка всех значений
Я работаю над созданием пользовательского поля формы в Django, где пользователи могут динамически вводить несколько текстовых значений на фронтенде. Однако я столкнулся с проблемой, когда в методе to_python
поля обрабатывается только последнее введенное текстовое значение, хотя я могу видеть все введенные значения в методах Request.POST
.
пользовательское поле с несколькими текстовыми значениями
Вот упрощенная версия моего кода:
#fields.py
class MultiCharField(forms.Field):
widget = Mywidget
def __init__(self, *args, **kwargs):
super(MultiCharField, self).__init__(*args, **kwargs)
def to_python(self, value):
print("value: " + str(value)) # it only prints the last text input
return value if isinstance(value, list) else [value]
<!-- mywidget.html -->
<div class="choice">
<input type="text" class="form-control" id="id-{{ widget.name }}" name="{{ widget.name }}"
{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %} />
<a href="#" class="add-field">Add Another</a>
</div>
<script>
$( ".add-field" ).on( "click", function() {
$('<div class="choice"><input type="text" name="{{ widget.name }}" /><a href="#" class="remove-field">Remove</a></div>').insertAfter($(this).parent());
$('.remove-field').on('click', function() {
$(this).parent().remove();
});
});
</script>
#forms.py
class QuestionModelForm(forms.ModelForm):
options = MultiCharField()
class Meta:
model = Question
class Mywidget(forms.Widget):
template_name = 'mywidget.html'
def get_context(self, name, value, attrs=None):
return {'widget': {
'name': name,
'value': value,
}}
def render(self, name, value, attrs=None, renderer=None):
context = self.get_context(name, value, attrs)
template = loader.get_template(self.template_name).render(context)
return mark_safe(template)
Я стремлюсь захватить все текстовые вводы, введенные пользователем в мое пользовательское поле, а не только последний. Метод Request.POST
правильно отображает все значения, но я не могу правильно обработать их в методе to_python
моего пользовательского поля. Как я могу обработать все текстовые данные, введенные пользователем в мое пользовательское поле?
Я успешно решил проблему, обратившись к документации Django, в которой говорится, что метод value_from_datadict отвечает за возврат значения виджета. Поэтому я счел необходимым переопределить этот метод в моем пользовательском виджете.
def value_from_datadict(self, data, files, name):
return data.getlist(name, None)