Django поле multi select сохраняет только одно значение
У меня есть форма, в которой можно выбрать провинцию и ее города. Вот модель, которую использует моя форма в моем приложении:
class ScientificSchedule(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
province = models.CharField(max_length=100, blank=True)
city = models.CharField(max_length=2048, blank=True)
#other fields
и форма:
class ScientificScheduleForm(forms.ModelForm):
class Meta:
model = ScientificSchedule
fields = '__all__'
также вот мои взгляды и HTML код:
class ScientificScheduleView(FormView):
model = ScientificSchedule
template_name = 'reg/scientific-schedule.html'
form_class = ScientificScheduleForm
success_url = '/scientific/schedule'
def post(self, request):
form = ScientificScheduleForm(request.POST)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def form_valid(self, form):
form.save()
return super(ScientificScheduleView, self).form_valid(form)
а это часть формы для полей города и провинции:
<form id="manager-users" method="POST" autocomplete="off" class="ant-form ant-form-horizontal">
{% csrf_token %}
<div class="ant-row-flex ant-row-flex-space-between" style="margin-left: -10px; margin-right: -10px;">
<div class="ant-col ant-col-xs-24 ant-col-md-12" style="padding-left: 10px; padding-right: 10px;">
<div class="ant-row ant-form-item formItemRow">
<div class="ant-col ant-form-item-label"><label for="province" class="ant-form-item-required" title="province">province</label></div>
<div class="ant-col ant-form-item-control-wrapper">
<div class="ant-form-item-control has-success">
<span class="ant-form-item-children">
<div id="province" class="ant-select ant-select-selection ant-select-selection--single" style="width: 100%;">
<select name="province" class="ant-col ant-select-selection ant-select-selection--single" role="combobox" aria-autocomplete="list" aria-haspopup="true" tabindex="-1">
<option value="" class=""> - </option>
</select>
</div>
</span>
</div>
</div>
</div>
</div>
<div class="ant-col ant-col-xs-24 ant-col-md-12" style="padding-left: 10px; padding-right: 10px;">
<div class="ant-row ant-form-item formItemRow">
<div class="ant-col ant-form-item-label"><label for="city" class="ant-form-item-required" title="city">city</label></div>
<div class="ant-col ant-form-item-control-wrapper">
<div class="ant-form-item-control has-success">
<span class="ant-form-item-children">
<div id="city" class="ant-select ant-select-selection ant-select-selection--single" style="width: 100%;">
<select multiple name="city" class="ant-col ant-select-selection ant-select-selection--single" role="combobox" aria-autocomplete="list" aria-haspopup="true" tabindex="-1" id="set-multi">
<option value="" class="" selected> - </option>
</select>
</div>
</span>
</div>
</div>
</div>
</div>
<div style="display: flex; justify-content: flex-end; margin-top: 1rem;">
<input id="btn_submit" type="submit" value="submit" class="ant-btn ant-btn-primary" />
</div>
</div>
Самое интересное в этих полях то, что поле города будет показывать только города в выбранной провинции. Поэтому сначала пользователь не может выбирать города, он должен выбрать одну провинцию, а затем выбрать 1, несколько или все города. Однако при отправке формы сохраняется только последний вариант, который я выбрал для города. Например, я выбираю city1, city4 и city5, но сохраняется только city5. как я могу сохранить это поле как список? Я хочу сохранить ['city1','city4','city5'] в поле city моей модели. спасибо за ответы
Трудно сказать, что именно вам нужно сделать, но я полагаю, что в вашей модели ScientificSchedule
у вас есть только 1 город как строка (т.е. в каждом расписании есть 1 город). Следовательно, вы не можете послать более одного города в эту таблицу, так как ей нужно только одно поле char!
Возможно, вам следует рассмотреть возможность использования ManyToManyField
вместо CharField
и сохранить города в вашей базе данных.
В противном случае необходимо убедиться, что CharField
может хранить список. Вы можете сделать это вручную или использовать JsonField или ArrayField (если вы используете Postgres).
В основном проблема, которую я пытаюсь осветить, заключается в том, что у вас есть CharField
для хранения 1 города, но вы хотите хранить несколько городов!