【问题标题】:allow the user to change his order values in the data base允许用户更改他在数据库中的订单值
【发布时间】:2020-09-24 20:41:19
【问题描述】:

我想允许用户从数据库中更改其订单中的值

这个想法是当用户按下删除按钮时,可见的值从是变为否,他将无法在个人资料上看到它

我成功提取了所有用户的订单

但我找不到让按钮仅更改当前用户订单值的方法

有什么办法可以做到吗?

models.py

class Order(models.Model):
    status_ch = [('in process', 'in process'), ('complete', 'complete')]
    visible_ch = [('yes', 'yes'), ('no', 'no')]
    status = models.CharField(
        choices=status_ch, max_length=20, null=True, blank=False, default='in process')
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, null=True, blank=True)
    saller = models.CharField(blank=True, max_length=200)
    product = models.CharField(blank=True, max_length=200)
    currency = models.CharField(blank=True, max_length=200)
    name = models.CharField(max_length=200, null=True, blank=False)
    phone = models.FloatField(null=True, blank=False)
    amount = models.FloatField(null=True, blank=False)
    email = models.EmailField(null=True, blank=True)
    accountId = models.TextField(default='', blank=False)
    date = models.DateField(default=datetime.date.today)
    image = models.ImageField('Label')
    visible_for_saller = models.CharField(
        choices=visible_ch, max_length=20, null=True, blank=False, default='yes')
    visible_for_buyer = models.CharField(
        choices=visible_ch, max_length=20, null=True, blank=False, default='yes')

    def __str__(self):
        return self.saller

views.py

@login_required
def profile(request):
    orders = Order.objects.filter(user=request.user)
    return render(request, 'app/profile.html', {'orders': orders})

【问题讨论】:

    标签: python django sqlite django-models django-views


    【解决方案1】:

    首先,您将visible 属性用作布尔值,所以我建议这样做:

    visible_for_saller = models.BooleanField(default=True)
    visible_for_buyer = models.BooleanField(default=True)
    
    

    那么,如果我理解得很好,你不想删除订单,只是让它对用户不可见,对吧? 如果是这种情况,您要制作的按钮必须调用一个视图,您只需在其中更改visible_for_buyer 属性,对吗?这可能是视图:

    def delete_order_for_buyer(request, pk):
        user = request.user  # you get the loged user
        order = Order.objects.get(pk=pk)  # you get the order through the pk
        if order.user == user:  # you check if the user is the owner of the order
            order.visible_for_buyer = False  # set the attr to false
            order.save()  # save that specific object
            return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))  # you redirect to the page you came (you can change this for whatever you want)
        else:
            raise PermissionDenied()  # in case someone that is not the user tries to execute that view through the url you make, it will raise an error.
    

    然后你只需要添加你想要的网址,比如:

        path('order/<pk>/delete/', views.delete_order_for_buyer, name='delete-order'),
    

    最后在您列出所有订单的视图上(如果您有很多订单,您可以创建一个 if 语句来检查 visible_for_buyer 是真还是假:

    {% if order.visible_for_buyer %}
      show content here
    {% endif %}
    

    根据你提供的所有信息,我不得不假设很多事情,但我想这会对你有所帮助

    【讨论】:

    • 谢谢你,它工作得很好,我只需要改变一些东西,比如 order.user == user not order.user != user 和我使用的路径 所以我可以使用正确的顺序,我希望不会对权限造成任何问题
    • true,我将编辑 if 语句。关于浴缸,正如我在这里所说的那样,它应该可以正常工作,因为 pk 始终是 int。当然你必须使用你需要的顺序的pk,但如果你愿意,你可以使用我在这里解释的路径,因为它会正常工作。
    • 好的,非常感谢您的解释和一切,我非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多