【问题标题】:How to increment database row by 1 for every time a link is clicked?每次单击链接时,如何将数据库行增加 1?
【发布时间】:2021-07-27 04:07:40
【问题描述】:

目前,每次我点击网站上的产品链接时,整个数据库列“视图”都会根据需要增加 1,因此只有行增加 1。链接会在外部网站中打开。通过单击产品图像打开链接。任何建议将不胜感激

模型.py

class T_shirt(models.Model):
    Images = models.ImageField()
    Titles = models.CharField(max_length=250, primary_key=True)
    Prices = models.CharField(max_length=250)
    Link = models.CharField(max_length=250)
    Website = models.CharField(max_length=250)
    Brand = models.CharField(max_length=250)
    views = models.IntegerField(default=0)

views.py

def t_detail(request):
    if request.method == 'POST':
        T_shirt.objects.update(views=F('views') + 1)

    if 'q' in request.GET:
        q = request.GET['q']
        owner_obj = T_shirt.objects.filter(Titles__icontains=q)
    else:
        owner_obj = T_shirt.objects.all()

    p = Paginator(owner_obj, 20)

    page_num = request.GET.get('page', 1)

    try:
        page = p.page(page_num)

    except EmptyPage:

        page = p.page(1)


    return render(request, 'tshirtshtml.html', {"owner_obj": page})

html

<ul class="products">
{% for v in owner_obj %}
    <div class="container">
    <form method="POST" type="submit">
        <button style="border: none;">
        {% csrf_token %}
    <a href="{{ v.Link }}" rel="noopener noreferrer">
  <img src="{{ v.Images }}" width="150" height="150">
    </a>
        </button>

    </form>

    <figcaption>  {{ v.Titles }} </figcaption>
    <figcaption> <b>{{ v.Prices }}</b></figcaption>
</div>

{% endfor %}

更新代码

def t_detail(request):
    if request.method == 'POST':
        T_shirt.objects.filter(Titles=request.POST.get('tshirt_id')).update(views=F('views') + 1)

    if 'q' in request.GET:
        q = request.GET['q']
        owner_obj = T_shirt.objects.filter(Titles__icontains=q)
    else:
        owner_obj = T_shirt.objects.all()

    p = Paginator(owner_obj, 20)

    page_num = request.GET.get('page', 1)

    try:
        page = p.page(page_num)

    except EmptyPage:

        page = p.page(1)

    return render(request, 'tshirtshtml.html', {"owner_obj": page})

【问题讨论】:

    标签: python html django database django-models


    【解决方案1】:

    您需要一些标识符来从 db 中获取该特定行,现在您正在使用此逻辑更新所有行:

        if request.method == 'POST':
            T_shirt.objects.update(views=F('views') + 1)
    

    对于当前的实现,由于您使用的是表单,因此您可以在表单中添加一个隐藏元素,例如:

    <form method="POST" type="submit">
    <button style="border: none;">
        {% csrf_token %}
     <input type="hidden" name="tshirt_id" value="{{ v.id }}" />
        <a href="{{ v.Link }}" rel="noopener noreferrer">
      <img src="{{ v.Images }}" width="150" height="150">
        </a>
            </button>
       </form>
    

    然后更改您的视图以从请求中获取 tshirt_id 并更新该行

    if request.method == 'POST':
            T_shirt.objects.filter(id=request.POST.get('tshirt_id')).update(views=F('views') + 1)
    

    【讨论】:

    • 谢谢老兄。由于某种原因,每次在行上更新视图列。该行移动到表格的底部。我认为索引更改为0。您知道如何将其保持在表格中的相同位置吗?
    • 是的,所以当单击项目链接时,它会更新表格,但会将行移动到表格中的随机位置。你知道为什么会这样吗?
    • 随机位置是什么意思?你如何检查行上的位置?
    • 因此,当单击产品的图像时,视图列会更新 1,但整行会移动到表格中的不同位置。例如,第一个产品位于表的顶部,但当单击该行时,视图列会更新 1,但会将该行发送到表的第 21 行。对行进行更新后,如何将行保持在表上的相同位置?
    • 尝试使用order_by('id') 来订购您的查询集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2022-10-22
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多