为了账号安全,请及时绑定邮箱和手机立即绑定

即使保存更新,Django 2 也会丢失模型的更改

即使保存更新,Django 2 也会丢失模型的更改

DIEA 2022-01-11 16:10:53
我正在使用 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 %}我正在尝试更新statusof order,当我提交order-cancel查看请求时,首先将其另存status为已取消,当我加载detailed(单个对象页面)时,它将更新status后的 o恢复一次。这里有什么问题?
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

您将使用merge()函数,然后最终提交会话。


db.session.merge(order)

db.session.commit()

绕过它的两种方法。解决方案 2 永远是我的最佳选择


1.) 使用对象查询获取方法


@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')


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信