Данные из формы не сохраняются в БД 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 и всё будет работать

Вернуться на верх