单击提交时未调用Django视图功能

Posted

技术标签:

【中文标题】单击提交时未调用Django视图功能【英文标题】:Django view function not being called on click of submit 【发布时间】:2020-04-16 05:22:35 【问题描述】:

我的views.py 中有两个视图函数。第一个渲染 index.html 第二个是为 index.html (update_db) 上的表单操作创建的。 当我点击 index.html 文件上的提交时,它会将 url 更改为 /update1,但函数调用有 print('HI'),我在控制台上看不到它。运行后也不会创建任何新文件。

最初我有 return render(request, 'index.html', ) 但我不确定是否应该返回。 我的 urls.py 有问题吗?

views.py

from django.shortcuts import render
from django.conf import settings
from .models import Image, Profile
import random
# Create your views here.
def index(request):

    y= random.randint(0,10)
    for i in range(0,10):
        pass 
    p = Image.objects.all()[y]
    print(p.p_img)
    count = p.p_img_count
    lst = [p.s_image1, p.s_image2, p.s_image3, p.s_image3, p.s_image4, p.s_image5]
    tmp =[]
    for i in range(0,3):
        px = Image.objects.all()[random.randint(0,14)]
        tmps=[px.s_image1, px.s_image2, px.s_image3, px.s_image3, px.s_image4, px.s_image5]
        tmp.append(tmps[random.randint(0,4)])

    x = random.randint(0,4)
    s_img = [lst[x]] + tmp
    random.shuffle(s_img)
    print('hevfxy')
    print(p.p_img)

    return render(request,'index.html',"p_img":p, "s_img": s_img, 'media_url':settings.MEDIA_URL)

def update_db(request):

    print('HI')
    # username = request.user.username
    user = request.POST.get("user")
    p_img = request.POST.get("p_img")
    ans = request.POST.get("ans")

    y = Image.objects.get(p_img=p_img).id
    y=y-8  
    Profile.objects.create(user=user, p_img_id=y, p_ans=ans)

    return something

urls.py(主配置)

from django.conf.urls import url, include
from django.urls import path
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + [
    url(r'^admin/', admin.site.urls),
    url(r'^login/$', auth_views.LoginView.as_view(template_name="login.html"), name="login"),
    url(r'^logout/$', auth_views.LogoutView.as_view(template_name="logout.html"), 'next_page': '/', name='logout'),
    url('^', include('pair.urls')),


] 

urls.py

from django.conf.urls import url
from django.urls import path

from . import views
app_name ='pair'

urlpatterns = [
    url('/update1', views.update_db, name='update_db'),
    url('$', views.index, name='index'),

]

index.html

<form action="/update1" method="POST" >

    % csrf_token %

  Player : <b>  user.get_username  </b> 
<p style="background-color: #ddd674">Primary image :
    <input type="hidden" name="user" id=" user.get_username " value=" user.get_username "></input>
    <input type="hidden" name="p_img" id=" p_img.p_img " value=" p_img.p_img "><img id="p_img" src="media_url p_img.p_img " height=300px ></input>

</p>
<hr height=2px >
<p style="background-color: #a7e0d9">Secondary image :

    % for img in s_img %
        % if img  %
            <input type="radio" id=" img " name="ans" value=" img " >
                <img src="media_url img " height=250px > 
            </input>
        % endif %
    % endfor %
    <br> 

</p>
<hr>
 ans 

<input type="submit" value="Submit" />
  </form>

【问题讨论】:

您在控制台中看到的错误是什么? @Abhyudai 没有错误。只是 def index(request) 里面有一个打印语句(它会打印在控制台上),即使在单击提交之后..索引视图也会被调用(地址栏中的 url 更改为 /update1 但不打印“HI”) 这意味着 urls 文件有问题。它将请求定向到您的索引函数。尝试删除索引函数路径中的$ 还是不行。即使我认为问题出在 urls.py 文件中,但我已经尝试更改顺序、我编写 url 的方式、删除和添加斜杠但仍然没有调用 update_db。我想知道的另一件事是return render(request, "index.html") 是否可以同时使用 index 和 update_db 函数。 是的,您可以为两个函数返回相同的模板,但从逻辑上讲,您可能希望使用将不同的数据传递给模板(在您的情况下为index.html),否则使用两个不同的函数是没有意义的。 【参考方案1】:

我认为您的 URL 是在“localhost:8000//update1”而不是“localhost:8000/update1”中引用的

只是改变这个:

url('/update1', views.update_db, name='update_db')

到那个:

url('update1', views.update_db, name='update_db')

【讨论】:

点击提交后,URL 会更改为 localhost:8000/update1(带和不带斜杠),但控制台中不会打印“HI”。【参考方案2】:

您可以在views.py 中添加任意数量的方法。除非它们返回渲染的 html 文件,否则我不认为 django 会将它们视为视图。

我的两个赌注是:

    更改url('/update1', views.update_db.as_wiew(), name='update_db'),

    使您的 update_db 方法返回类似 return render(something) 的内容。

希望收到您的来信!

【讨论】:

print 语句在任何情况下都应该起作用,但它不起作用。所以似乎还有其他问题。 你怎么确定这个方法被调用了?? 这可能是这里的问题。如果它没有按照原始海报的当前状态被调用,我猜你的赌注不会解决它们。 原始发帖人试图通过 url 访问该方法但失败了。我的赌注是基于 django 由于我的赌注而无法将该方法识别为视图。所以“打印语句在这种情况下不起作用”对吗? 其实我只想在点击提交按钮后渲染 index.html 。 update_db 是将函数请求的值存储在函数中。我最初有 return render(request, 'index.html') 但它仍然不会打印 'HI' 表明它没有被调用,这就是为什么我不确定渲染 index.html 是否是问题。

以上是关于单击提交时未调用Django视图功能的主要内容,如果未能解决你的问题,请参考以下文章

Django POST 不调用视图

单击按钮时未发送 Django Post 请求

在按钮单击时运行 django 视图/功能

Django如何通过单击带有变量的提交按钮从ajax调用views.py中的函数

在 Django 中,如何单击按钮来调用视图然后重新加载页面

为啥在javascript中单击时未设置输入值?