[英]request.method == 'POST' is not working in Django
我在模板中创建了一个表单以在数据库中插入数据但表单不起作用。当我提交表单时什么也没发生。请检查我的所有代码并给我一些建议。
add.html 模板文件:
<h2>Add Article</h2>
<form action="" method="post">
{% csrf_token %}
<label>Title</label>
<input type="text" name="title"
placeholder="Enter Title">
<label>Category</label>
<select name="cate">
<option value="">Select Category</option>
{% for cat in get %}
<option value="{{ cat.cate }}">{{ cat.cate }}
</option>
{% endfor %}
</option>
</select>
<label>Discription</label>
<textarea name="desc" rows="15">
</textarea>
<input type="submit" value="submit" class="btn btn-default">
</form>
我创建了 2 个视图。在第一个视图中,我渲染了在表单选择菜单中添加的所有类别,第二个视图用于处理表单
视图.py
from django.shortcuts import render, redirect
from .models import article, category
def get_category(request):
get = category.objects.all()
context = {
'get':get
}
return render(request, 'blog/add.html', context)
def add(request):
if request.method == 'POST':
title = request.POST['title']
cate = request.POST['cat']
desc = request.POST['desc']
art = article(title=title, disc=desc, cat=cate)
art.save()
return redirect('blog/index.html')
else:
return render(request, 'blog/add.html')
模型.py
from django.db import models
class category(models.Model):
cate = models.CharField(max_length=100)
def __str__(self):
return self.cate
class article(models.Model):
title = models.CharField(max_length=250)
disc = models.TextField()
cat = models.ForeignKey(category, verbose_name="Category")
posted = models.DateTimeField(auto_now_add=True, editable=False)
updated = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
网址.py
from django.conf.urls import url
from .import views
app_name = 'blog'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^add/$', views.get_category, name='category'),
url(r'^add/$', views.add, name='add'),
]
在您的情况下,每次操作都转到 get_category,因为 django 会找到第一个匹配的 url 并将其用于操作。
您可以为您的案例创建一个函数:在 views.py 中
def category(request):
if request.method == 'POST':
title = request.POST['title']
# update start
cat = request.POST['cat']
cate = Category.objects.get(pk=cat)
# Update end
desc = request.POST['desc']
art = article(title=title, disc=desc, cat=cate)
art.save()
return redirect('blog/index.html')
get = category.objects.all()
context = {
'get':get
}
return render(request, 'blog/add.html', context)
在 urls.py 中
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^add/$', views.get_category, name='category'),
# !! comment or remove last urls
# url(r'^add/$', views.add, name='add'),
]
我进行了编辑,但是如果您使用django 表单查看并重建您的逻辑会更好。
<input type="submit" class="btn btn-primary" value="Add item">
添加提交按钮而不是 type = 'button'
如果 POST 方法不起作用,则重新配置项目(makemigration 和 migrate)
改变:
return redirect(request, 'blog/index.html')
至:
return redirect('index')
'index'是views.py文件中视图函数的名称属性。 由于重定向不将“请求”参数作为参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.