【问题标题】:Django : How to differentiate post requests from different pages that are coming to the same page?Django:如何区分来自同一页面的不同页面的发布请求?
【发布时间】:2019-10-28 10:08:29
【问题描述】:

我有两个页面都包含表单。但是,两个页面都将发布请求发送到同一页面。如何区分哪个页面发送了请求。

dummy.html(第一页)

<form action="/nda" method='POST'>
        {% csrf_token %}
        <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>

        <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
</form>

此页面重定向到 nda 页面。

nda.html(第二页)

此页面也会重定向到同一页面。

<form action="/nda"  method='POST'>
        {% csrf_token %}
    <button type="submit" name="submit" id="submit" value="I Agree" target="_self">I Agree</button>
    <button onclick="window.open('/greeting')" target="_self"> I Disagree </button></br>
</form>

我的问题是,在我看来,我如何区分它来自哪个页面,它来自虚拟页面或与 nda 相同的页面。

views.py

def nda(request):
    if request.method=='POST' :
        # if this is from dummy I want to do this
        return render(request,'mainapp/nda.html',{'user':email.split('@')[0]})

    if request.method=='POST' :
        # if this is from same page that is nda I want to do this
        return render(request,'mainapp/home.html')

我无法弄清楚,我如何以不同的方式处理这两种情况

【问题讨论】:

  • 为什么不让他们去两个不同的视图?
  • 在那种情况下,我不会问这个问题
  • (1) 如果您正在编写应用程序的两端,为什么不使用像...page_origin 这样的普通参数? (2) 您可能认为views.py 是两者的通用代码,并且刚刚遇到第一个反例,所以也许设计不正确......? (听起来您将不得不在不久的将来进行重构,您最好现在就从头开始)。正如肯特已经建议的那样。你似乎对你的设计太确定了,这是一个常见的错误。在这种情况下不复制某些代码可能会很昂贵。再考虑一下。
  • @HimanshuPoddar 抱歉,如果这是一个愚蠢的建议,但对我来说,这感觉就像 XY problem 的一个案例。为什么你不能让他们去两个视图?例如,您是否试图在视图中不重复代码?
  • 通常您只需保留 action=""(空白),以便他们将 POST 到最初获取页面的 URL,这对于两个页面来说会有所不同。

标签: python django post django-views http-post


【解决方案1】:

如果我正确理解您的问题,您可以在提交按钮中使用 name 属性

<button type="submit" name="submit1" id="submit" value="I Agree"  target="_blank">I Agree</button

<button type="submit" name="submit2" id="submit" value="I Agree"  target="_blank">I Agree</button

在视图中

def nda(request):
    if request.method=='POST' and 'submit1' in request.POST :
        # do something
        return render(request,'mainapp/nda.html',{'user':email.split('@')[0]})

    elif request.method=='POST' and 'submit2' in request.POST:
        #do something else
        ...

【讨论】:

    【解决方案2】:

    它是如何工作的? 您单击提交按钮,服务器正在访问.. 类型为 submit 的按钮遵循表单标记中指定的“操作”路径 也就是说,让你对不同的页面有请求,你需要创建一个额外的url、views和html

    例子:

    one_html.html

    <form action="{% url your_app:name1 %}" method='POST'>
            {% csrf_token %}
            <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>
    
            <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
    </form>
    

    urls.py:

    ...
    url(r'^' + app_name + 'some_path', views_one, name='name1'),
    

    views.py:

    def views_one(request):
        if request.method=='POST':
            # do something
    

    例子:

    two_html.html

    <form action="{% url your_app:name2 %}" method='POST'>
            {% csrf_token %}
            <button type="submit" name="submit" id="submit" value="I Agree"  target="_blank">I Agree</button>
    
            <button onclick="window.open('/greeting')" target="_blank"> I Disagree </button></br>
    </form>
    

    urls.py:

    ...
    url(r'^' + app_name + 'some_path', views_two, name='name2'),
    

    views.py:

    def views_two(request):
        if request.method=='POST':
            # do something
    

    不同之处在于action指向不同的url,因此会被称为不同的视图

    【讨论】:

    • 你知道你可以被禁止继续回答 1.这是错误的答案 2.格式不正确 3.即使正确的答案也不适用于 Django 2+
    • 抱歉,我的文本格式不正确,所以不清楚
    猜你喜欢
    • 1970-01-01
    • 2021-04-14
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2022-11-25
    • 2012-02-03
    • 2019-01-02
    相关资源
    最近更新 更多