繁体   English   中英

request.method == 'POST' 在 Django 中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM