Django-Render在我的项目中不起作用

时间:2019-01-01 21:02:56

标签: django forms render

我正在处理大约1周的表格,但无法解决我的问题。可能我忽略了其他人可以轻松找到的东西,但是总的来说,我不知道该怎么办。我通过启动构建表单来识别问题。我必须使用render进行表单,但每次尝试均失败。我能够连接数据库并在html页面中显示数据,但是每当我使用render而不是render_to_response时,它就会失败。据我所知,我必须使用render进行发帖。 render不仅适用于表单,还不能全部使用。即使简单:def home(request): context = {'foo': 'bar'} return render(request, 'main.html', context)

models.py

class ModuleNames(models.Model):
    ModuleName = models.CharField(max_length = 50)
    ModuleDesc = models.CharField(max_length = 256)
    ModuleSort = models.SmallIntegerField()
    isActive = models.BooleanField()
    ModuleType = models.ForeignKey(ModuleTypes, on_delete=models.CASCADE, null = True)
    slug = models.SlugField(('ModuleName'), max_length=50, blank=True)

class Meta:
    app_label = 'zz'
def __unicode__(self):
    return self.status

forms.py

from django import forms
from MyApp.models import ModuleNames

class ModuleForm(forms.ModelForm):
    moduleName = forms.CharField(label='Module Name', max_length=50)
    ModuleDesc = forms.CharField(max_length = 256)
    ModuleSort = forms.IntegerField()
    isActive = forms.BooleanField()
    ModuleType = forms.IntegerField()

class Meta:
    model = ModuleNames
    fields =('moduleName','ModuleDesc','ModuleSort','isActive','ModuleType')

view.py

from django.views.generic import TemplateView
from django.shortcuts import render,render_to_response, redirect
from django.template import RequestContext
import json
from django.core.serializers.json import Serializer
from django.http import HttpResponse, Http404, HttpResponseRedirect
from urllib.parse import urlparse
from django.urls import resolve 
from django.db import connection
from collections import namedtuple
from django.db.models import F
from django.views.decorators.cache import cache_page
from django.views.decorators.csrf import csrf_protect

from MyApp.models import ModuleNames
from MyApp.forms import ModuleForm

def AddNewModule(request):
    template_name = 'addnewmodule.html'
    if request.method == 'GET':
        form = ModuleForm()
        posts = ModuleNames.objects.all()
        args = {'form': form, 'posts': posts }
        return render(request, template_name, args) #This part is showing data when i use render_to_response. But after clicking Save button on html page, it will give below first error.

    if request.method == 'POST':
        form = ModuleForm(request.POST)
        if form.is_valid():
            form.pop('csrfmiddlewaretoken', None)
            post = form.save(commit=False)
            post.save()
            text = form.cleaned_data['post']
            form = ModuleForm()
            args = {'form': form, 'text': text}
            return render(request, template_name, args)
  1. 使用render_to_response时出现错误 禁止的(403) CSRF验证失败。请求中止。

    帮助 失败原因: CSRF令牌丢失或不正确。

  2. 我将render用于任何功能时出错

        Environment:
    Request Method: GET
    Request URL: http://127.0.0.1:8000/addnewmodule
    
    Django Version: 2.1.3
    Python Version: 3.7.1
    Installed Applications:
    ['MyApp',
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles']
    Installed Middleware:
    ['django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware']
    
    Traceback:
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
    34.response = get_response(request)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
    126.response = self.process_exception_by_middleware(e, request)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
    124.response = wrapped_callback(request, *callback_args, **callback_kwargs)
    
    File "/Users/Cem/Documents/Projects/Python/Web/FirstApp/MyApp/views.py" in addnewmodule
    132.return render(request, template_name, args)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/shortcuts.py" in render
    36.content = loader.render_to_string(template_name, context, request, using=using)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/template/loader.py" in render_to_string
    62.return template.render(context, request)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/template/backends/django.py" in render
    61.return self.template.render(context)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/template/base.py" in render
    169.with context.bind_template(self):
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py" in __enter__
    112.return next(self.gen)
    
    File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/template/context.py" in bind_template
    246.updates.update(processor(self.request))
    
    Exception Type: TypeError at /addnewmodule
    Exception Value: 'module' object is not callable
    

2 个答案:

答案 0 :(得分:0)

在django中了解CSRF tokens,它用于站点保护/

答案 1 :(得分:0)

您缺少csrf_token格式的addnewmodule.html,因此, 您可以回到addnewmodule.html的形式,然后像这样在标签{% csrf_token %}下方添加form action="" method="POST"

<form action="" method="POST">
{% csrf_token %}