【问题标题】:Django - Render is not working in my projectDjango - 渲染在我的项目中不起作用
【发布时间】:2019-05-28 15:54:50
【问题描述】:

我正在处理 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
    

【问题讨论】:

  • render_to_response 已过时且已弃用。几个版本后将被删除。不要使用它。只使用render
  • @xyres 我知道,但render 在项目的任何地方都不起作用。
  • 你能把这段代码放在你的视图顶部并告诉我终端的输出是什么 - print(type(render))。您必须向视图发出请求才能打印某些内容。
  • 你为什么用pop 代替csrf_tokens ?删除pop 方法后重试。
  • 这没有帮助。顺便说一句,我从头开始创建新项目并在新项目中使用相同的功能,然后一切正常。我不知道我在旧项目中破坏了什么,但我会比较它们,如果找不到问题,那么将创建新项目。

标签: django forms render


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的addnewmodule.html 表单中缺少csrf_token,因此, 您可以返回addnewmodule.html 表单并像这样在标签form action="" method="POST" 下方添加{% csrf_token %}

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多