Django 2 потерял изменения на моделях даже после сохранения обновления - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над проектом с использованием Python (3.7) и Django (2.1), в котором я обновляю модель и сохраняю ее, после чего, если я сначала проверяю вид списка, он показывает обновление правильно, но как только я открылв детальном представлении оно потеряло обновление и вернулось в предыдущее состояние.

Вот что я пробовал:

С models.py:

class Order(models.Model):
    status_choices = (
        ('Active', 'Active'),
        ('Completed', 'Completed'),
        ('Late', 'Late'),
        ('Short', 'Short'),
        ('Canceled', 'Canceled'),
        ('Submitted', 'Submitted')
    )
    delivery_status_choices = (
        ('Accepted', 'Accepted'),
        ('Rejected', 'Rejected')
    )
    gig = models.ForeignKey('Gig', on_delete=models.CASCADE)
    seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='selling')
    buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='buying')
    created_at = models.DateTimeField(auto_now=timezone.now())
    charge_id = models.CharField(max_length=234)
    days = models.IntegerField(blank=False)
    status = models.CharField(max_length=255, choices=status_choices)
    delivery = models.FileField(upload_to=content_file_name, blank=True)

    def __str__(self):
        return f'{self.buyer} order from {self.seller}'

С template.html:

{%  if not order.status == 'Completed' and not order.status == 'Submitted' and not order.status == 'Canceled' %}
     {% if order.buyer.username == user.username %}
           <form method="post" action="{% url 'order-cancel' %}">
                 {% csrf_token %}
                 <input type="text" name="id" value="{{ order.id }}" hidden />
                 <button type="submit" class="btn btn-primary align-content-center">Cancel the Order</button>
             </form>
      {% elif order.status == 'Canceled' %}
             <p> Your order has been canceled already!</p>
      {% endif %}
    {% else %}
        <p> You can't cancel this order now.</p>
 {% endif %}

и С views.py:

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)
            order = Order.objects.get(id=order_id)
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            order.save()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')

Я пытаюсь обновитьstatus из order, когда я отправляю запрос к представлению order-cancel, сначала он сохраняет status как отмененный, а когда я загружаю detailed (Страница одного объекта), он возвращает обновленный status назад oпредыдущий раз.

Что тут может быть не так?

Заранее спасибо!

1 Ответ

1 голос
/ 16 апреля 2019

вы включите функцию merge () и, наконец, завершите сеанс.

db.session.merge(order)
db.session.commit()

Два способа обойти это. Решение 2 всегда мой лучший выбор

1.) Используя метод запроса объектов get

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)
            order = Order.objects.get(id=order_id)
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            db.session.merge(order)
            db.session.commit()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')

2.) Используя объектный запрос filter_by

@login_required()
def order_cancel(request):
    if request.method == 'POST':
        try:
            order_id = request.POST.get('id')
            print(order_id)          
            order = Order.query.filter_by(id=order_id).first()
            charge_id = order.charge_id
            refund = stripe.Refund.create(
                charge=charge_id,
            )
            order.status = 'Canceled'
            db.session.merge(order)
            db.session.commit()
            print(order.status)
            print('success')
            return HttpResponseRedirect(reverse_lazy('buying'))
        except Order.DoesNotExist:
            return redirect('home')
...