【问题标题】:Django - Anyway to call a view function from a button on a template?Django - 无论如何要从模板上的按钮调用视图函数?
【发布时间】:2019-01-30 04:08:33
【问题描述】:

我已经看到发布了几个相同的问题,但我仍然不明白如何做到这一点。我有显示超链接的模板,这些超链接导致要更新的实际记录。我想在模板上放置一个按钮,该按钮仅显示列表,以便能够通过循环遍历此“临时”表中的每个记录来在表中创建记录。该行为旨在模仿电子商务网站上的购物车。这就是我将记录存储在此临时表中的原因,因为当它们“签出”时,它们将被视为具有多行的 1 个订单。

在视图中编写逻辑不是问题,它在按下按钮时调用此函数,我不明白。谢谢!

编辑:

我为单击提交按钮时想要发生的行为编写了一些伪代码

def process_basket(request):
    basket = table1
    dbtable = table2

    for each record in basket:
        create new record in dbtable
        delete record in basket after 

    refresh page to show empty list

更新:

basket.html

{% load static %}

{% if user_list %}
    <table>
    {% for created_req in user_list %}
        <tr>
            <td>
                <a href="{% url 'requisition:basket_item' created_req.id %}">{{ created_req }}</a>     
            </td>
        </tr>    
    {% endfor %}
    </table>
    <form action="{% url 'requisition:process_basket' %}" method="POST">
        {% csrf_token %}
        <input type="button" value="Submit Req">
    </form>
{% else %}
    <p>No requisitions in basket</p>
{% endif %}

urls.py

path('basket/', views.basket_list, name='basket'),
path('basket/<int:id>/', views.update_basket_item, name='basket_item'),
path('basket/process/', views.process_basket, name='process_basket')

views.py

def process_basket(request):
    if request.method == 'POST':
        user = CurrentUser.objects.get(username=request.user)
        basket_list = ReqBasket.objects.filter(user=user)
        # Make decision as to set the status depending on what flag is ticked
        #   Assitance, Submitted 


        cur_status = RequisitionStatus.objects.get(status='Created')
        header = Requisition.objects.create(username=user, status=cur_status)
        for line in len(basket_list):
            req_line = RequisitionLine.objects.create(
                                        parent_req = header,
                                        sequence = line,
                                        description = basket_list.description,
                                        extra_information=basket_list.extra_information,
                                        quantity = basket_list.quantity,
                                        price = basket_list.price,
                                        req_delivery_date = basket_list.req_delivery_date)
        return redirect(reverse('requisition:submitted_reqs'))
    else:
        return redirect(reverse('requisition:basket'))

【问题讨论】:

  • 到目前为止您尝试过什么?你的模型?
  • 通过 AJAX 调用。
  • @sachin 我还没有尝试过任何东西,我只想在按下按钮时调用一个函数来运行。我不想进行 url 调用。
  • @WillemVanOnsem 我还没有对 AJAX 调用做过任何工作,如果你不介意的话,你能提供更多信息吗?
  • 要触发此功能,您需要有一个额外的 url,您将向其发出请求。

标签: django django-rest-framework django-templates django-views


【解决方案1】:

根据您上面所说的(模仿购物车),我认为您的解决方案更像是前端解决方案。使用 Javascript 和浏览器的 Sessions 或 Localstorage API。结帐时,您现在可以将其发送到服务器,这时 Django 就到位了。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2014-08-18
    • 1970-01-01
    • 2018-12-27
    • 2011-03-11
    • 1970-01-01
    • 2014-09-01
    • 2010-10-22
    • 2020-12-22
    相关资源
    最近更新 更多