python - Django 1.11 : post form data to database

标签 python django python-3.6 django-1.11

我正在制作一个超简约的博客应用程序作为第一个项目。我无法让我的表单的 CharField 显示在页面上,而且我无法找到关于如何将该表单数据放入我的数据库的简明解释。

为清楚起见进行编辑:我正在努力使任何人都可以发布内容,而不仅仅是像官方教程中那样具有管理员权限的人。

表单.py:

  1 from django import forms                                                                                        
  2                                                                                                                 
  3 class ContentForm(forms.Form):                                                                                  
  4     form_post = forms.CharField(widget = forms.TextInput)  

views.py:

  1 from django.shortcuts import render                                                                             
  2 from django.http import HttpResponse                                                                            
  3 from .forms import ContentForm                                                                                  
  4 from .models import Post                                                                                        
  5                                                                                                      
  6 def post(request ):                                                                                             
  7     #testvar = "TEST VARIABLE PLZ IGNORE"                                                                       
  8     post_list = Post.objects.order_by('id')                                                                     
  9                                                                                                      
 10     return render(request, 'posts/main.html',                                                                   
 11             {'post': post_list},                                                                     
 12     )                                                                                                           
 13                                                                                                      
 14 def content_get(request):                                                                                       
 15                                                                                                      
 16     if request.method == 'POST':                                                                                
 17                                                                                                      
 18         form = ContentForm(request.POST)                                                                        
 19                                                                                                      
 20         return render(request, 'main.html', {'form':form})

main.html:

  1 <head>                                                                           
  2   <h1>Nanoblogga</h1>                                                                                       
  3                                                                                                             
  4 </head>                                                                          
  5                                                                                                             
  6 <body>                                                                                                      
  7   {% for i in post %}                                                                                       
  8   <li>{{ i }}</li>                                                                                          
  9   {% endfor %}                                                                                              
 10                                                                                                             
 11                                                                                                             
 12   <form action = '/' method = 'post'>                                                                       
 13     {% csrf_token %}                                                                                        
 14     {{ form }}                                                                                              
 15     <input type = 'submit' value = 'Submit' />                                                              
 16   </form>                                                                        
 17 </body> 

模型.py

from django.db import models

class Post(models.Model):
    content = models.CharField(max_length = 200)

    def __str__(self):
return self.content

非常感谢您的意见。

最佳答案

根据你的代码,有很多地方需要修改:

forms.py:您需要 ModelForm 才能使用模型 Post

from django.forms import ModelForm
from .models import Post 
class ContentForm(ModelForm):
    class Meta:
        model = Post
        fields = "__all__" 

views.py:您必须将 form 传递给模板,以便它可以显示在您的 main html 中,并调用 form.save() 将数据保存到数据库中。

from django.shortcuts import render, redirect                                                                             
from django.http import HttpResponse                                                                            
from .forms import ContentForm                                                                                  
from .models import Post

def post(request ):                                                                                             
    post_list = Post.objects.order_by('id')
    form = ContentForm()
    return render(request, 'posts/main.html',
        {'post': post_list,
        'form':form},
    )                                                                                                           
def content_get(request):
    if request.method == 'POST':
        form=ContentForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('/')

假设您有这样的 urls.py 应用:

from django.conf.urls import url

from . import views

app_name = 'post'

urlpatterns = [
    url(r'^$', views.post, name='main'),
    url(r'^content$', views.content_get, name='content_get'),
]

最后在ma​​in.html中,您需要定义要发布的action:

<html>
<head>                                                                           
<h1>Nanoblogga</h1>                                                                                       
</head>                                                                          
<body>
    {% for i in post %}                                                                                       
    <li>{{ i }}</li> 
    {% endfor %}           

    <form action = '/content' method ='post'>
    {% csrf_token %} 
    {{ form }}
    <input type = 'submit' value = 'Submit' />
    </form>
</body> 
</html>

关于python - Django 1.11 : post form data to database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712022/

相关文章:

python - Pandas - 过滤和正则表达式搜索 DataFrame 的索引

javascript - 如何在 Django View 执行时停止它?

python - 分页不接受字典作为数据 - 不可散列的类型

python - python 中的字符串切片

python - 在 tkinter 的 root.mainloop() 开始后初始化(Python)

python - unittest 无法从 pickle 导入类(AttributeError : Can't get attribute. ..)

python - 在Python中正确终止线程

python - MySQL-python 安装无法在 virtualenv 中运行

python - 如何为 QListWidget 中的每个项目制作上下文菜单?

javascript - 如何正确地将 django csrf_token 附加到内联 javascript 中?