Данные из формы не сохраняются в БД Django
В моём проекте появился очень странный баг. Пока сайт разрабатывался и был на локальной машине, абсолютно всё работало как надо. Но когда я поставил сайт на хостинг, он почему-то перестал сохранять данные формы. Суть в том, что если заполнить только первое поле формы (to_index), то она сохранится и перейдет на следующую страницу, как и должно быть. А если же заполнить все три поля(to_index, city, phone_number), то форма не сохраняет никаких данных и не производит переадресацию. Со всеми остальными формами в проекте таких багов нет. База данных, которая была при разработке - sqlite3, бд, которая используется сейчас - MySQL.
views.py
def cart_ship_true(request):
order = Order.objects.filter(user=request.user, status=Order.STATUS_CART).first()
ship = ShipCalculater.objects.filter(user=request.user, status=ShipCalculater.STATUS_AFTER, order = order.id).first()
error = ''
if request.method == 'POST':
form = ShipCalculaterForm(request.POST)
if form.is_valid():
ship.to_index = form.cleaned_data.get("to_index")
ship.city = form.cleaned_data.get("city")
ship.phone_number = form.cleaned_data.get("phone_number")
ship.save()
response=requests.get(f'https://postprice.ru/engine/russia/api.php?from={ship.from_index}&to={ship.to_index}&mass={ship.mass}&valuation=500&vat=1').json()
ship.ship_amount = response['pkg']
order.ship_amount = response['pkg']
order.save()
ship.save()
return HttpResponseRedirect('cart_ship/')
else:
error = 'Форма была неверной'
form = ShipCalculaterForm()
context = {
'form': form,
'error': error,
}
return render(request, 'shop/ship_form.html', context)
forms.py
class ShipCalculaterForm(ModelForm):
class Meta:
model = ShipCalculater
fields = ["to_index", "city", "phone_number"]
widgets = {
"to_index": TextInput(attrs={
'placeholder': 'Индекс вашего почтового отделения'
}),
"city": TextInput(attrs={
'placeholder': 'Ваш город, улица и номер дома'
}),
"phone_number": TextInput(attrs={
'placeholder': 'Ваш номер телефона'
})
}
models.py
class ShipCalculater(models.Model):
STATUS_BEFORE = '1_before'
STATUS_AFTER = '2_after'
STATUS_CHOICES = [
(STATUS_BEFORE, 'Ожидает подтверждения'),
(STATUS_AFTER, 'Подтверждено')
]
from_index = models.IntegerField(
verbose_name='Индекс отправителя', default=190000, null=True, blank=True)
to_index = models.IntegerField(
verbose_name='Индекс получателя', null=True, blank=True)
city = models.CharField(
max_length=250, verbose_name='Адрес получателя', null=True, blank=True)
phone_number = models.IntegerField(
verbose_name='Номер получателя', null=True, blank=True)
mass = models.IntegerField(
verbose_name='Масса товара', null=True, blank=True)
status = models.CharField(max_length=32, choices=STATUS_CHOICES,
default=STATUS_BEFORE, verbose_name='Состояние заказа')
user = models.ForeignKey(User, on_delete=models.CASCADE,
verbose_name='Пользователь', null=True, blank=True)
creation_time = models.DateTimeField(
auto_now_add=True, verbose_name='Время создания', null=True, blank=True)
order = models.IntegerField(null=True, blank=True)
ship_amount = models.IntegerField(
blank=True, null=True, verbose_name='Цена доставки')
@staticmethod
def get_address(user: User):
order = Order.objects.filter(
user=user, status=Order.STATUS_CART).last()
adress = ShipCalculater.objects.filter(
user=user, status=ShipCalculater.STATUS_BEFORE).first()
# Эта доп. переменная для того, если калькулятор уже существует, вся логика не ломалась.
# Она позволяет не создавать пустой калькулятор, а изменить уже существующий
adress2 = ShipCalculater.objects.filter(
user=user, order=order.id, status=ShipCalculater.STATUS_AFTER).last()
if not adress:
if adress2:
adress = adress2
else:
adress = ShipCalculater.objects.create(
user=user, from_index=352808, status=ShipCalculater.STATUS_BEFORE, mass=0)
return adress
def make_address(self, user: User):
adress = ShipCalculater.objects.filter(user=user).last()
if adress and self.status == ShipCalculater.STATUS_BEFORE:
order = Order.objects.filter(
user=self.user, status=Order.STATUS_CART).last()
self.mass = order.weight
self.order = order.id
self.status = ShipCalculater.STATUS_AFTER
self.save()
def get_addreses(user: User):
order = Order.objects.filter(
user=user, status=Order.STATUS_CART).last()
adress = ShipCalculater.objects.filter(
user=user, status=ShipCalculater.STATUS_AFTER, order=order.id).last()
return adress
ship_form.html
<form method="post">
{% csrf_token %}
<center>
{{ form.to_index }}
{{ form.city }}
{{ form.phone_number }}
<button type="submit" class="btn btn-link"><a class="boxed-btn black"
style="font-family:Roboto">Посчитать</a></button>
</center>
</form>
Как оказалось, проблема была в MySQL, у которого IntegerField не должен превышать 10 символов (из-за этого в SQLite3 всё сохранялось, ибо там нет такого ограничения). Просто замените IntegerField на CharField в models.py и всё будет работать