【问题标题】:request.method == 'POST' is not working in Djangorequest.method == 'POST' 在 Django 中不起作用
【发布时间】:2018-01-30 06:38:31
【问题描述】:

我在模板中创建了一个表单以在数据库中插入数据,但表单无法正常工作。当我提交表单时,什么也没发生。请检查我的所有代码并给我一些建议。

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 个视图。在第一个视图中,我渲染了添加到表单选择菜单中的所有类别,第二个视图用于处理表单

views.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')

Models.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

urls.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'),
 ]

【问题讨论】:

标签: python django forms post


【解决方案1】:

变化:

return redirect(request, 'blog/index.html')

收件人:

return redirect('index')

'index'是views.py文件中视图函数的名称属性。由于重定向不将“请求”参数作为参数。

【讨论】:

    【解决方案2】:

    &lt;input type="submit" class="btn btn-primary" value="Add item"&gt; 添加提交按钮而不是 type = 'button'

    【讨论】:

      【解决方案3】:

      如果 POST 方法不起作用,则重新配置项目(makemigration 和 migrate)

      【讨论】:

        【解决方案4】:

        在您的情况下,每次操作都转到 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 forms 查看并重建您的逻辑,它会更好。

        【讨论】:

        • 我根据您的建议更改了代码并收到此错误:MultiValueDictKeyError at /add/ "'cat'"
        • 我更改了一些值,现在出现此错误:ValueError at /add/ 无法分配“''”:“article.cat”必须是“类别”实例。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-07
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2013-02-03
        • 2017-11-27
        • 1970-01-01
        相关资源
        最近更新 更多